.net 重用IEnumerable<;T>;结果为假结果,例如:on.Any()
我有点迷路了: 我声明了IEnumerable实现类的一个实例.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,但是循
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类的信息吗?使用simpleList
创建您想要的功能,我没有任何问题。若两个代码片段之间并没有更改集合,那个么若WordEnumerable类按预期工作,那个么您的代码也应该工作。。谢谢你,乔恩!我的错。。我重用了枚举数:)它是一个IEnumerable,因此==比较可以正常工作。
Console.WriteLine("First");
foreach (var word in wordEnumerable)
{
Console.WriteLine(word);
}
Console.WriteLine("Second");
foreach (var word in wordEnumerable)
{
Console.WriteLine(word);
}