你能把这个代码简化为单线程吗?

时间:2015-02-25 20:31:24

标签: c#

此代码是否可转换为1个衬垫或最大2衬垫?

int indexOfSpace = response.IndexOf(" ");
int indexOfNewLine = response.IndexOf("\n");
string responseSubString = "";

if (indexOfNewLine > 0 && indexOfNewLine < indexOfSpace)
{
    responseSubString = response.Substring(0, response.IndexOf("\n"));
}
else
{
    responseSubString = response.Substring(0, response.IndexOf(" "));
}

基本上,我试图从第一个单词后面可能包含空格或新行的字符串中获取第一个单词。

3 个答案:

答案 0 :(得分:4)

试试这个:

responseSubString = response.Split(' ', '\n')[0];

此代码按空格和新行符号拆分字符串并返回第一个成员。它假定字符串不为空,在这种情况下,您将获得NullReferenceException

为了更好地控制,您可以使用带有额外参数的重载,这些参数定义了在拆分操作中使用的字符串项数(您不需要多于1个)和删除空字符串的选项(如果您有多个字符串)连续):

responseSubString = response.Split(new char[] {' ', '\n'}, 2, StringSplitOptions.RemoveEmptyEntries)[0]

答案 1 :(得分:2)

除了使用String.Split之外,此正则表达式也应该起作用:

//Find the first word in a string
string myString = "thisisthefirstword of this\nstring\n";
string firstWord = Regex.Match(myString, @"^([\w\-]+)").Value;

// firstWord: "thisisthefirstword"

然而,接受的答案大约快了10倍(2分钟而不是20分钟,100万次执行)。

答案 2 :(得分:0)

这是五个:

  • 正则表达式:从字符串开头到第一个空格的锚定匹配

    firstWord = Regex.Match(   text , @"^\S+"       ).Value ;
    
  • 正则表达式:使用锚定匹配从第一个空格到字符串结尾进行修剪

    firstWord = Regex.Replace( text , @"\s.*$" , "" ) ;
    
  • LINQ的

    firstWord = text.TakeWhile( c => !char.IsWhiteSpace(c) ).Aggregate(new StringBuilder(), (sb,c) => sb.Append(c) ).ToString();
    
  • 使用string.Substring()string.IndexofAny()

    的两种变体
    // this will fail if the string has no whitespace
    firstWord = text.Substring(0, text.IndexOfAny( " \r\n\t\f\v".ToCharArray() ) ) ;
    
    // this will NOT fail in the same condition ... at the expense of creating a temporary
    firstWord = (text+" ").Substring(0, text.IndexOfAny( " \r\n\t\f\v".ToCharArray() ) );
    

应该注意的是,这些都不可能像简单明显的那样快速:

public static string FirstWord( this string s )
{
  if ( s == null ) throw new ArgumentNullException("s");

  int i = 0 ;
  while ( i < s.Length && !char.isWhiteSpace(s[i]) )
  {
    ++i ;
  }

  if ( i == 0 ) throw new InvalidOperationException("no word found");
  return s.Substring(0,i);

}