Повторное использование IEnumerable‹T› приводит к ложному результату, например. на .Любой()

Я немного потерялся в земле отсроченного исполнения:

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

var wordEnumerable = new WordEnumerable(_text);

Затем я перебираю его (первое слово «Лорем»)

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

.. который пишется в консоли.

Теперь сразу после этого в коде я делаю

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

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

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

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

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

Обновление:

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


person Jörg Battermann    schedule 07.02.2011    source источник
comment
Как WordEnumerable реализует IEnumerable<T>?   -  person Daniel A. White    schedule 07.02.2011
comment
Не могли бы вы предоставить нам больше информации о классе WordEnumerable? У меня нет проблем с созданием нужной вам функциональности с помощью простого List<string>. И если коллекция не менялась между обоими фрагментами кода, то ваш код тоже должен работать, если класс WordEnumerable работает как положено.   -  person Jarek    schedule 07.02.2011
comment
Ну вот, добавил ссылки на источники   -  person Jörg Battermann    schedule 07.02.2011


Ответы (1)


Ваше ожидание верно — 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>, иначе ваша проверка == будет контрольной проверкой личности.

person Jon Skeet    schedule 07.02.2011
comment
О боже.. Спасибо, Джон! Плохо... Я повторно использовал Enumerator :) Это IEnumerable‹string›, поэтому сравнение == работает нормально. - person Jörg Battermann; 07.02.2011