重用IEnumerable <t>会导致错误的结果,例如on .Any()</t>

时间:2011-02-07 13:05:02

标签: .net ienumerable ienumerator deferred-execution

我在延期执行的土地上有点迷失:

我声明了一个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循环上面,我确实得到了一个真,但是循环确实从第二个单词开始。

我的期望是.Net为IEnumerable及其底层IEnumerator的每次调用创建了不同的运行时'contexts',因此它们不会干扰...我不想.Reset( )为了得到正确的结果,手工制作?

我在这里缺少什么?

更新

..它基本上是一个IEnumerable,允许我迭代给定字符串中的单词。

1 个答案:

答案 0 :(得分:3)

您的期望是正确的 - 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>,否则您的==检查将成为参考身份检查。