2012-11-13 2 views

ответ

27

Необходимо разбить строку. Вы можете использовать overload без параметра (предполагаются пробелы).

IEnumerable<string> words = str.Split().Take(250); 

Обратите внимание, что вам нужно добавить using System.Linq для Enumerable.Take.

Вы можете использовать ToList() или ToArray() ро создать новую коллекцию из запроса или сохранить память и перечислить ее непосредственно:

foreach(string word in words) 
    Console.WriteLine(word); 

Update

Так как кажется, довольно популярны Я добавляю следующее расширение, которое более эффективно, чем метод Enumerable.Take, а также возвращает коллекцию вместо (отложенное исполнение) запрос.

Используется String.Split, где white-space characters считаются разделителями, если параметр разделителя равен нулю или не содержит символов. Но метод также позволяет передавать различные разделители:

public static string[] GetWords(
     this string input, 
     int count = -1, 
     string[] wordDelimiter = null, 
     StringSplitOptions options = StringSplitOptions.None) 
{ 
    if (string.IsNullOrEmpty(input)) return new string[] { }; 

    if(count < 0) 
     return input.Split(wordDelimiter, options); 

    string[] words = input.Split(wordDelimiter, count + 1, options); 
    if (words.Length <= count) 
     return words; // not so many words found 

    // remove last "word" since that contains the rest of the string 
    Array.Resize(ref words, words.Length - 1); 

    return words; 
} 

Это можно легко использовать:

string str = "A B C D E F"; 
string[] words = str.GetWords(5, null, StringSplitOptions.RemoveEmptyEntries); // A,B,C,D,E 
+1

«Если параметр разделителя имеет значение NULL или не содержит символов, символы пробела считаются разделителями». –

+0

+1 ... Также, если бы вопрос был реальным, то поиск пространства/пробелов/разделителей был бы более подходящим (например, «\ w + \ s»), возможно, в сочетании с 'yield return', чтобы не читать за пределами первых 250 слов. –

+0

@AlexeiLevenkov: Обратите внимание, что 'Split' без аргументов не совпадает с' Split ('') '. Он использует внутреннюю оболочку ['Char.IsWhiteSpace'] (http://msdn.microsoft.com/en-us/library/t809ektx.aspx), которая включает в себя несколько символов. –

9
yourString.Split(' ').Take(250); 

Я думаю. Вы должны предоставить дополнительную информацию.

+8

Почему вы создаете новый список из массива до 250? –

+0

Я бы использовал take before ToList, чтобы воспользоваться ленивой оценкой IEnumerable – BlackBear

+0

@TimSchmelter Tiping из памяти. Я не был уверен, что Array был IEnumerable. Это были не некоторые версии C# назад. Редактирование. Благодарю. – LMB

1
string testString = "The quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dog." 
string firstWords = Regex.Match(testString, @"^(\w+\b.*?){250}").ToString(); 
0

Дополнение к Тиму ответ, это то, что вы можете попробовать

IEnumerable<string> words = str.Split().Take(250); 
StringBuilder firstwords = new StringBuilder(); 
foreach(string s in words) 
{ 
    firstwords.Append(s + " "); 
} 
firstwords.Append("..."); 
Console.WriteLine(firstwords.ToString()); 
0

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

public string TakeWords(string str,int wordCount) 
{ 
    char lastChar='\0'; 
    int spaceFound=0; 
    var strLen= str.Length; 
    int i=0; 
    for(; i<strLen; i++) 
    { 
     if(str[i]==' ' && lastChar!=' ') 
     { 
      spaceFound++; 
     } 
     lastChar=str[i]; 
     if(spaceFound==wordCount) 
      break; 
    } 
    return str.Substring(0,i); 
} 
0

Это возможно без вызова Take().

string[] separatedWords = stringToProcess.Split(new char[] {' '}, 250, StringSplitOptions.RemoveEmptyEntries); 

Что также позволяет расщепление, основываясь на более чем просто пространство «» и, следовательно, фиксирует вхождений, когда пробелы неправомерно отсутствующий на входе.

string[] separatedWords = stringToProcess.Split(new char[] {' ', '.', ',' ':', ';'}, 250, StringSplitOptions.RemoveEmptyEntries); 

Используйте StringSplitOptions.None, если вы хотите, чтобы вместо него были возвращены пустые строки.

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