Повторное использование IEnumerable <T>приводит к ложному результату, например, в .Any () - PullRequest
3 голосов
/ 07 февраля 2011

Я немного заблудился в отложенной казни:

Я объявляю экземпляр класса реализации IEnumerable

var wordEnumerable = new WordEnumerable(_text);

Затем я перебираю его (первое слово - "Lorem")

foreach (var word in wordEnumerable)
                    Console.WriteLine(word);

.. который записывается на консоль.

Теперь прямо в коде я делаю

Console.WriteLine(wordEnumerable.Any(w => w == "Lorem"));

.. и получите False в качестве вывода.

Теперь, если я помещаю часть .Any (..) над циклом foreach, я получаю значение true, однако цикл начинается со второго слова.

Мое ожидание заключалось в том, что .Net создает разные «контексты» времени выполнения для каждого вызова IEnumerable и его основного IEnumerator, чтобы они не мешали ... Я бы не хотел .Reset () это вручную, чтобы получить правильный результат?

Что мне здесь не хватает?

Обновление

.. Это в основном IEnumerable, который позволяет мне перебирать слова в данной строке.

1 Ответ

3 голосов
/ 07 февраля 2011

Ваши ожидания верны - Any снова позвонит GetEnumerator, чтобы получить свежие IEnumerator<T>. Это должно быть хорошо , если вы правильно внедрили IEnumerable<T>. Я предполагаю, что ваша реализация WordEnumerable неверна. Пожалуйста, отправьте код:)

Что произойдет, если вы напишите:

Console.WriteLine("First");
foreach (var word in wordEnumerable)
{
    Console.WriteLine(word);
}

Console.WriteLine("Second");
foreach (var word in wordEnumerable)
{
    Console.WriteLine(word);
}

? Другая вещь, которую нужно проверить, это то, что WordEnumerable реализует IEnumerable<string> вместо IEnumerable<object>, в противном случае ваша проверка == будет проверкой ссылочной идентичности.

...