使用LINQ First()方法显示了ienumerable可能的多次迭代;Resharper的警告
本文关键字:迭代 警告 Resharper ienumerable First LINQ 方法 显示 使用 | 更新日期: 2023-09-27 18:10:02
我有这样的代码:
Person firstPerson = personsEnumerable.First();
,其中personsEnumerable
为IEnumerable<Person>
现在,Resharper强调了personsEnumerable变量,并说"IEnumerable的可能迭代"。我明白这个警告意味着什么,从这里的其他问题在SO,但我想知道为什么它显示它在我的例子?我认为First()返回第一个元素,根本不需要迭代集合?
这是一个'一般'警告消息,这是不适用于我的情况下(我可以忽略它),或者我不明白First()实际上是如何工作的?
是的,它返回第一个元素,但它仍然创建一个枚举数来获取第一个元素。您可以在Where
之后添加ToArray
或ToList
来防止这种情况。然而,如果你只想获得第一个元素,你可以使用First
的重载版本,它接受Func
委托,你可以删除Where
。
考虑以下代码:
var personsEnumerable = peopleList.OrderBy(p => p.Age);
var firstPerson = personsEnumerable.First();
foreach (var p in personsEnumerable)
{
// whatever
}
第一行代码设置了对列表进行排序并创建结果,但是在您尝试枚举它之前,它实际上并没有做任何事情。第二行代码将完成排序。因此,尽管您没有枚举整个结果,但您正在执行生成结果的代码。而对于某一类人来说,这将需要做所有繁重的工作。
foreach
循环将在实际枚举结果之前再次执行排序。