2016-03-06 2 views
0

Я пытаюсь перечислить значения List в разных методах (просто для отправки итератора в качестве аргумента). Он работает хорошо, но, к моему удивлению, значение индекса сбрасывается до 1 после выхода из метода. Вот пример - можете ли вы объяснить мне, как это работает и как его решить?Enumerators reset значение индекса

Большое вам спасибо!

public void SaveHistory(string folder) 
{ 
    using (var iterator = Items.GetEnumerator()) 
    { 
     foreach (var file in _files) 
      if (!Proceed(Path.Combine(folder, file.Name), iterator)) //first call 
       break; 
      //AND HERE my iterator.Index value is 1 again. 
     while (Proceed(GetNewFileName(folder), iterator)) { } 
    } 
} 
private bool Proceed(string fileName, IEnumerator<HistoryItemBase> iterator) 
{ 
    var dose = new List<HistoryItemBase>(); 
    if (iterator.MoveNext()) 
    { 
     while (dose.Count < LogFileItemsCount && iterator.MoveNext()) 
      dose.Add(iterator.Current); 
     //DO Something 
    } 
    return false; //<- Here iterator.MoveNext() returns false and it's index value is ok 
} 
+4

[Это структура] (http://stackoverflow.com/questions/3168311/why-do-bcl-collections-use-struct-enumerators-not-classes), [передать его ссылкой] (http://stackoverflow.com/questions/16614704/pass-c-sharp-struct-by-reference) или рассмотрим другой дизайн, который вообще не требует прохода вокруг перечислителя. – CodeCaster

+0

Yep .. понимаете это только после того, как задаете вопрос. Плохая идея работать до ночи :) Но большое вам спасибо за ваш ответ! –

ответ

0

Ну, ответ очень прост - в моем случае итераторе является структурой и все переходит к Структуре методов по значению, а не ссылаться .. И в моем случае я не могу просто добавить реф слова к параметр, потому что я работаю с использованием-statement.

Спасибо!

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