2010-04-09 43 views
2

我有一個叫做ProperCase的函數,它接受一個字符串,然後將每個單詞中的第一個字母轉換爲大寫。所以ProperCase(「約翰史密斯」)將會返回「約翰史密斯」。下面是代碼:使用LINQ和lambda表達式將字符串放入正確的情況

public string ProperCase(string input) 
    { 
     var retVal = string.Empty; 
     var words = input.Split(' '); 

     foreach (var word in words) 
     { 
      if (word.Length == 1) 
      { 
       retVal += word.ToUpper(); 
      } 
      else if (word.Length > 1) 
      { 
       retVal += word.Substring(0, 1).ToUpper() + word.Substring(1).ToLower(); 
      } 

      retVal += ' '; 
     } 

     if (retVal.Length > 0) 
     { 
      retVal = retVal.Substring(0, retVal.Length - 1); 
     } 

     return retVal; 
    } 

此代碼workds完美,但我敢肯定,我可以用LINQ和lambda表達式做更優雅。有些人可以告訴我如何?

回答

6

拆分輸入字符串轉換成單詞,每個單詞轉換爲標題情況,並加入轉換的字一起回來:

TextInfo textInfo = new CultureInfo("en-US", false).TextInfo; 

string result = string.Join(" ", input.Split(' ') 
             .Select(word => textInfo.ToTitleCase(word)) 
             .ToArray()); 
+0

謝謝,非常完美!我添加了一個ToLower到lambda: word => textInfo.ToTitleCase(word.ToLower()) – 2010-04-09 21:01:50

+0

這裏不必使用Linq。無論單詞數量多少,textInfo.ToTitleCase(輸入)都會執行相同的操作。 – SergioL 2011-06-02 20:09:06

0

另一個解決方案是

Regex.Replace(input, @"\b\w", m => m.ToString().ToUpper());