2017-04-26 63 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); 
} 
相关问题