为什么它不迭代IEnumerable的所有元素

本文关键字:元素 IEnumerable 迭代 为什么 | 更新日期: 2023-09-27 18:29:49

我有这个代码:

public static void myMethodMytype paramObject, IEnumerable<MyType> paramObjects)
{
    IEnumerable<Mytype> ieFilteredObjects = paramObjects.Where(x=>x.IDType == paramObject.IDType);
    if (ieFilteredObjects.Count() == 2)
    {
        foreach (MyType iterator in ieFilteredObjects)
        {
            iterator.MyProperty = null;
        }
    }
}

在这种情况下,ieFilteredObjects有2个元素,但在foreach中,只更新第一个元素和foreach的出口。

如果在前臂我使用这个:

foreach (MyType iterator in ieFilteredObjects.ToList())

那么它就如预期的那样工作。

为什么我必须将IEnumerable转换为列表?

谢谢。

为什么它不迭代IEnumerable的所有元素

IEnumerable只能迭代一次不能在IEnumerable上迭代两次,并且期望得到相同的值

例如,IEnumerable可能来自yield return函数,每次在IEnumeraable上调用GetEnumerator()时,都会启动对该函数的新调用,该调用可能会创建新值。

这不是一个常见的用例,但它是存在的。我已经在生产中遇到了这种错误。

解决方案是缓存第一次迭代的结果。一种常见的技术是使用linq:.ToList()创建IList,这样就可以无限次迭代

在您的代码中,您至少迭代两次:

  • ieFilteredObjects.Count()
  • foreach(ieFilteredObjects中的MyType迭代器)