.net 重用IEnumerable<;T>;结果为假结果,例如:on.Any()

.net 重用IEnumerable<;T>;结果为假结果,例如:on.Any(),.net,ienumerable,ienumerator,deferred-execution,.net,Ienumerable,Ienumerator,Deferred Execution,我有点迷路了: 我声明了IEnumerable实现类的一个实例 var wordEnumerable = new WordEnumerable(_text); 然后我重复它(第一个词是“Lorem”) 。。它被写入控制台 现在,在代码中,我做了一个 Console.WriteLine(wordEnumerable.Any(w => w == "Lorem")); 。。并得到一个False作为输出 现在,如果我把.Any(..)部分放在foreach循环上面,我会得到一个true,但是循

我有点迷路了:

我声明了IEnumerable实现类的一个实例

var wordEnumerable = new WordEnumerable(_text);
然后我重复它(第一个词是“Lorem”)

。。它被写入控制台

现在,在代码中,我做了一个

Console.WriteLine(wordEnumerable.Any(w => w == "Lorem"));
。。并得到一个False作为输出

现在,如果我把.Any(..)部分放在foreach循环上面,我会得到一个true,但是循环确实以第二个单词开始

我的期望是.Net为对IEnumerable及其底层IEnumerator的每次调用创建不同的运行时“上下文”,这样它们就不会干扰。。。我不想手动重置()以获得正确的结果

我错过了什么

更新

  • 链接到IEnumerable实现:
  • 链接到IEnumerator实现:
  • 。。最后是底层文本解析器实现:

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

您的期望是正确的-
任何
都将再次调用
GetEnumerator
以获取新的
IEnumerator
。如果您正确地实现了
IEnumerable
,那么这应该没问题。我猜您对
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
,而不是
IEnumerable
,否则您的
=
检查将是一个参考身份检查。

如何实现
WordEnumerable
?您能为我们提供更多关于WordEnumerable类的信息吗?使用simple
List
创建您想要的功能,我没有任何问题。若两个代码片段之间并没有更改集合,那个么若WordEnumerable类按预期工作,那个么您的代码也应该工作。。谢谢你,乔恩!我的错。。我重用了枚举数:)它是一个IEnumerable,因此==比较可以正常工作。
Console.WriteLine("First");
foreach (var word in wordEnumerable)
{
    Console.WriteLine(word);
}

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