3

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

我声明了一个 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 创建不同的运行时“上下文”,因此它们不会干扰......我不想手动 .Reset() 以获得正确的结果?

我在这里想念什么?

更新

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

4

1 回答 1

3

您的期望是正确的 -AnyGetEnumerator再次致电以获得新鲜感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>,否则您的==检查将是参考身份检查。

于 2011-02-07T13:09:50.093 回答