使用LINQ First()方法显示Resharper的“可能的IEnumerable的多次迭代”警告

时间:2014-06-24 14:48:08

标签: c# linq resharper

我有这样的代码:

  

Person firstPerson = personsEnumerable.First();

,其中personsEnumerableIEnumerable<Person>

现在,Resharper强调了peopleEnumerable变量,并说“可能的IEnumerable迭代”。我理解这个警告在这里的其他问题意味着什么,但我想知道它为什么在我的例子中显示它?我认为First()返回第一个元素,根本不需要迭代集合吗?

这是一个“一般”警告信息,在我的情况下不适用(我可以忽略它)或者我不明白First()实际上是如何工作的?

2 个答案:

答案 0 :(得分:3)

是的,它会返回第一个元素,但它仍然会创建一个枚举器来获取第一个元素。您可以在ToArray之后添加ToListWhere来阻止这一点。但是,如果您想获得第一个元素,可以使用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循环会再次进行排序