我有这样的代码:
Person firstPerson = personsEnumerable.First();
,其中personsEnumerable
为IEnumerable<Person>
现在,Resharper强调了peopleEnumerable变量,并说“可能的IEnumerable迭代”。我理解这个警告在这里的其他问题意味着什么,但我想知道它为什么在我的例子中显示它?我认为First()返回第一个元素,根本不需要迭代集合吗?
这是一个“一般”警告信息,在我的情况下不适用(我可以忽略它)或者我不明白First()实际上是如何工作的?
答案 0 :(得分:3)
是的,它会返回第一个元素,但它仍然会创建一个枚举器来获取第一个元素。您可以在ToArray
之后添加ToList
或Where
来阻止这一点。但是,如果您想获得第一个元素,可以使用First
Func
Where
代表{{1}}代理,您可以删除{{1}}。
答案 1 :(得分:3)
考虑以下代码:
var personsEnumerable = peopleList.OrderBy(p => p.Age);
var firstPerson = personsEnumerable.First();
foreach (var p in personsEnumerable)
{
// whatever
}
第一行代码设置了对列表进行排序并创建结果,但在尝试枚举之前,它实际上并不执行任何操作。第二行代码然后最终会进行排序。因此,虽然您没有枚举整个结果,但您正在执行代码来生成结果。而对于某种类型,这将需要做所有繁重的工作。
在实际枚举结果之前,foreach
循环会再次进行排序。