2015-02-25 5 views
-2

Является ли этот код конвертируемым на 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(" ")); 
} 

В принципе, я пытаюсь получить первое слово из строки, которая может содержать пробел или новую строку после первого слова.

+5

Just одна строка :) 'int indexOfSpace = response.IndexOf (" "); int indexOfNewLine = response.IndexOf ("\ n"); string responseSubString = ""; if (indexOfNewLine> 0 && indexOfNewLine EZI

+0

@EZI :) также' string.Join ("", response.TakeWhile (c => c! = '' && c! = '\ N')) 'более честный однострочный ... –

+0

' responseSubString = str.Split (new [] {'', '\ n'}, 2) .First(); ' – Habib

ответ

4

Попробуйте это:

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

Этот код разбивает строку на пространство и новый символ строки и возвращает первый элемент. Он предполагает, что строка не является нулевой, и в этом случае вы получите NullReferenceException.

Для лучшего контроля вы можете использовать перегрузку с дополнительными параметрами, которые определяют, сколько строковых элементов использовать в режиме разделения (вам не нужно больше 1) и параметры для удаления пустых строк (если у вас несколько строк в ряд):

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

Он делает ненужные усилия, чтобы разделить всю строку, ища все пространство и новую строку, а не только первую. – Servy

+1

'responseSubString = response! = Null? ответ.Split ('', '\ n') [0]: null; 'возвращает первое слово строки или null, если строка равна null. – learningcs

+0

Я пробовал свой код. Это дает мне результат, когда строка ответа содержит новую строку сразу после первого слова. Но это не работает, если за первым словом следует пробел. – Vishal

2

в качестве альтернативы использованию String.split, это Regex должен также работать:

//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 минут на 1 миллион казней).

+0

Спасибо, что постарался ответить на мой вопрос. – Vishal

0

Вот пять:

  • Регулярное выражение: якорь матч от начала строки до первого пробела

    firstWord = Regex.Match( text , @"^\S+"  ).Value ; 
    
  • Регулярное выражение: обрезки от 1 пробельных до конца-строки с помощью привязанного матч

    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); 

} 
Смежные вопросы