2014-11-28 1 views
0

Я выполняю итерацию через IEnumerable, как показано ниже.Do Enumerable.ElementAt в той же итерации Enumerable

IEnumerable<string> readFile = ... ; 
int lineNumber = 1; 

foreach (string readLine in readFile) 
{ 
    ... 

    lineNumber++; 
} 

Но во время цикла я должен проверить следующую строку. И я использую ElementAt для этого:

foreach (string readLine in readFile) 
{ 
    ... 
    if (readFile.ElementAt(lineNumber+1) == ...) 
    { 
     // Do something 
    } 

    lineNumber++; 
} 

Когда я использую приведенный выше код с ElementAt, я получаю Possible multiple enumeration of IEnumerable

Можете ли вы объяснить мне это? Или есть другое решение, которое я могу использовать? Я должен использовать IEnumerable, потому что я работаю с большими файлами

+0

Если вы используете 'File.ReadAllLines' вместо' File.ReadLines' читать строки, которые вы хотите получить массив. Затем вы можете использовать 'ElementAt', не перечислив весь файл снова и снова. Он оптимизирован таким образом, что он использует индекс, если его можно отличить до 'IList '. –

+0

Но как насчет производительности? Не ReadAllLines медленнее, чем ReadLines? – Ozkan

+0

Не обязательно, если файл не такой большой. Он читает все в памяти, поэтому он может быть более дорогим с точки зрения потребления памяти. –

ответ

5

Ну какое-то время вы называете ElementAt, если это только последовательности (т.е. не IList<T>) ему придется перебирать весь путь до конца последовательности, насколько как данный номер элемента - нет другого способа добраться до значения.

Похоже, вы просто должны иметь:

string previousLine = null; 
foreach (var line in readFile) 
{ 
    // Work with line and previousLine here, understanding that on the 
    // first iteration it will be null 

    previousLine = line; 
} 
+1

@Ozkan: Предполагая, что вы ничего не можете сделать только с первой строкой файла, да. –

+0

@Ozkan: Ну, это требует немного другого решения. Есть что-то еще, что вам нужно? Я не хочу оставлять разные биты кода, а затем снова менять требования ... –

+0

@Ozkan: Хорошо, я отредактирую свой ответ, но, пожалуйста, в следующий раз убедитесь, что вы описали свою * целую * проблему в вопрос. –

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