重用 IEnumerable导致错误结果,例如在 .Any() 上

发布于 2024-10-16 05:45:56 字数 1077 浏览 2 评论 0原文

我在延迟执行领域有点迷失:

我声明了一个 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这允许我迭代给定字符串中的单词。

I'm a little lost in deferred execution land:

I declare an instance of an IEnumerable implementing class

var wordEnumerable = new WordEnumerable(_text);

Then I iterate over it (the first word is "Lorem")

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

.. which is written to the console.

Now right thereafter in code I do a

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

.. and get a False as output.

Now If I put the .Any(..) part above the foreach loop I do get a true, however the loop does start with the second word.

My expectation was that .Net creates different runtime 'contexts' for each call to an IEnumerable and its underlying IEnumerator so they don't interfere... I wouldn't want to .Reset() it by hand in order to get a proper result?

What am I missing here?

Update:

.. It is basically an IEnumerable that allows me to iterate over the words within a given string.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清风疏影 2024-10-23 05:45:56

您的期望是正确的 - Any 将再次调用 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,否则你的 == check 将作为参考身份检查。

Your expectation is correct - Any will call GetEnumerator again to get a fresh IEnumerator<T>. That should be fine if you've implemented IEnumerable<T> correctly. My guess is that your implementation of WordEnumerable is incorrect. Please post the code :)

What happens if you write:

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

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

? The other thing to check is that WordEnumerable implements IEnumerable<string> rather than IEnumerable<object>, otherwise your == check will be a reference identity check.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文