yield всегда вызывается

В настоящее время я читаю коллекцию элементов из потока. Я делаю это следующим образом:

public class Parser{

 private TextReader _reader; //Get set in Constructor
 private IEnumerable<Item> _items;    

 public IEnumerable<Item> Items{
  get{
   //I >>thought<< this would prevent LoadItems() from being called twice.
   return _items ?? (_items = LoadItems());
  }
 }

 public IEnumerable<Item> LoadItems(){
  while(_reader.Peek() >= 0){
   yield return new Item(_reader.ReadLine()); //Actually it's a little different
  }
 }
}

Допустим, у меня есть поток, содержащий два элемента, и я делаю следующее:

var textReader = //Load textreader here
var parser = new Parser(textReader);
var result1 = parser.Items.Count();
var result2 = parser.Items.Count();

Теперь результат1 равен 2, а результат2 равен единице. .

Теперь я заметил, что мой нулевой чек бесполезен? Кажется, что каждый раз, когда я вызываю эту функцию, она все равно возвращается.

Может кто-нибудь объяснить мне, почему это так? И какое было бы лучшее решение в этой ситуации (скажите, пожалуйста, то, что я делаю, полная чушь: P).

6
задан Oded 26 January 2012 в 10:52
поделиться