为什么它不迭代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可能来自yield return
函数,每次在IEnumeraable上调用GetEnumerator()
时,都会启动对该函数的新调用,该调用可能会创建新值。
这不是一个常见的用例,但它是存在的。我已经在生产中遇到了这种错误。
解决方案是缓存第一次迭代的结果。一种常见的技术是使用linq:.ToList()
创建IList
,这样就可以无限次迭代
在您的代码中,您至少迭代两次:
- ieFilteredObjects.Count()
- foreach(ieFilteredObjects中的MyType迭代器)