2017-04-26 62 views
0

以下函數將在字符串中找到的任何大寫字符處拆分字符串。按大寫字母拆分字符串,但某些關鍵字除外

public static string ToSentence(this string input) 
{ 
    var list = new List<char>(); 
    for (var i = 0; i < input.ToCharArray().Length; i++) 
    { 
     var c = input.ToCharArray()[i]; 
     foreach (char c1 in i > 0 && char.IsUpper(c) ? new[] {' ', c} : new[] {c}) 
      list.Add(c1); 
    } 
    return new string(list.ToArray()); 
} 

在我的代碼中,這個函數與另一個函數一起使用,它檢索代碼中當前方法的名稱。當方法名稱按順序包含多個大寫字母時,我發現該函數會中斷。

舉例來說,如果我有一個名爲GetDatabaseIDE()方法,它會返回爲"Get Database I D E"

我怎樣才能改變我的ToSentence功能,使其接受,不會被拆分的關鍵字的列表(例如,I D EIDE)?

+1

取出'ToCharArray()'調用,你無意中創建了很多垃圾,因爲'string'本身允許下標。內部的foreach循環也非常複雜,因爲你正在做的事情。只要'if(something){list.Add(''); }/* always */list.Add(c);'會更快,也更容易理解。 –

+0

順便說一句,你已經將問題描述爲「當輸入包含多個大寫字母時按順序打斷」 - 這比實現關鍵字列表更容易實現。雖然您可能想分割「IHaveBacon」,即使有順序大寫。 –

+0

假設'IDE'是某個東西的首字母縮寫,更快的方法可能使用正則表達式完成:http://stackoverflow.com/questions/8495457/split-pascalcase-string-except-for-acronyms。 –

回答

1

爲什麼不試試Regex? Demo @https://dotnetfiddle.net/FsPZ9O
1. ([A-Z]+) - 匹配所有主要的大寫char。
2. ([^A-Z])* - 後跟零個或多個不是大寫字母的字符。

Regex.Matches("GetDatabaseIDE", @"([A-Z]+)([^A-Z])*").Cast<Match>().Select(m => m.Value); 
+0

剛發現這個礦已經有了答案。 http://stackoverflow.com/questions/8495457/split-pascalcase-string-except-for-acronyms –

0

TakeWhile方法可以在這裏很有用,一旦你找到一個大寫字符,你可以採取以下大寫字母:

for (var i = 0; i < input.Length; i++) 
{ 
    var c = input[i]; 
    if(char.IsUpper(c)) 
    { 
     var charsToAdd = input.Skip(i).TakeWhile(char.IsUpper).ToArray(); 
     if(charsToAdd.Length > 1) 
     { 
      i += charsToAdd.Length - 1; 
     } 

     if(i > 0) list.Add(' '); 

     list.Add(charsToAdd); 
    } 
    else 
    { 
     list.Add(c); 
    } 
} 
0

你可以添加你想跳過關鍵字:

public static string ToSentence(string input) 
{ 
    var list = new List<char>(); 
    for (var i = 0; i < input.ToCharArray().Length; i++) 
    { 
      if(input.IndexOf("IDE",i,input.Length-i)==i){ 
       list.AddRange(" IDE"); 
       i+=2; 
      } 
      else{ 
       var c = input.ToCharArray()[i]; 
       foreach (char c1 in i > 0 && char.IsUpper(c) ? new[] {' ', c} : new[] {c}) 
       list.Add(c1); 
      } 
    } 
    return new string(list.ToArray()); 
} 

看它here

+0

'input.IndexOf(keyword)== i'不是關鍵字是否出現在位置'i'的正確測試,因爲'IndexOf'只能找到第一個匹配項。更不用說爲每個字符搜索每個關鍵字的整個輸入是相當低效的。 –

+0

謝謝,修正了 –

0

這將適用於你的例子,你將不得不調整它,如果你的方法名稱中有數字

using System.Text.RegularExpressions; 
public static string GetNiceName(string testString) 
{ 
    var pattern = "([A-Z][a-z]+)|([A-Z]+)"; 
    var result = new List<string>(); 
    foreach (Match m in Regex.Matches(testString, pattern)) 
    { 
     result.Add(m.Groups[0].Value); 
    } 
    return string.Join(" ", result); 
} 
相關問題