2011-12-07 45 views
2

我有一个包含文本的变量,如:如何将PascalCase转换为分词?

ShowSummary 
ShowDetails 
AccountDetails 

有没有在C#一个简单的方法函数/方法,我可以适用于这些变量产生:

"Show Summary" 
"Show Details" 
"Account Details" 

我想知道的延伸方法,但我从来没有编码一个,我不知道从哪里开始。

+0

'CameCase'是不是骆驼情况下! 'camelCase'是。 – abatishchev

+2

这就是所谓的PascalCase – kol

+2

阿肖克有一个很好的答复。请注意camelCase和PascalCase之间的区别(http://cplus.about.com/od/learnc/ss/csharpclasses_5.htm) –

回答

1

在我目前工作的应用程序,我们有一个基于委托分裂扩展方法。它看起来像这样:

public static string Split(this string target, Func<char, char, bool> shouldSplit, string splitFiller = " ") 
{ 
    if (target == null) 
     throw new ArgumentNullException("target"); 

    if (shouldSplit == null) 
     throw new ArgumentNullException("shouldSplit"); 

    if (String.IsNullOrEmpty(splitFiller)) 
     throw new ArgumentNullException("splitFiller"); 

    int targetLength = target.Length; 

    // We know the resulting string is going to be atleast the length of target 
    StringBuilder result = new StringBuilder(targetLength); 

    result.Append(target[0]); 

    // Loop from the second character to the last character. 
    for (int i = 1; i < targetLength; ++i) 
    { 
     char firstChar = target[i - 1]; 
     char secondChar = target[i]; 

     if (shouldSplit(firstChar, secondChar)) 
     { 
      // If a split should be performed add in the filler 
      result.Append(splitFiller); 
     } 

     result.Append(secondChar); 
    } 

    return result.ToString(); 
} 

则可以使用它,如下所示:

string showSummary = "ShowSummary"; 
string spacedString = showSummary.Split((c1, c2) => Char.IsLower(c1) && Char.IsUpper(c2)); 

这允许您分割在两个char S之间的任何条件,并插入您选择的填料(默认的空间)。

2

最好的方法是迭代字符串中的每个字符。检查字符是否大写。如果是这样,请在它之前插入一个空格字符。否则,转到下一个字符。

此外,理想情况下,从第二个字符开始,以便在第一个字符之前不插入空格。

7

看到这个post由Jon加洛韦,一个由Phil

+1

我更喜欢Jon的单线正则表达式解决方案。 – neontapir

1

尝试这样的事情

var word = "AccountDetails"; 
word = string.Join(string.Empty,word 
    .Select(c => new string(c, 1)).Select(c => c[0] < 'Z' ? " " + c : c)).Trim();