这有什么区别:
myList.Where(item => item == 0).First();
还有这个:
myList.First(item => item == 0);
后者对我来说更有意义,因为它更短,但我似乎更频繁地看到顶级版本.
解决方法
这取决于.如果LINQ正在转换为sql,那么它取决于如何处理转换.如果你正在使用LINQ到对象(例如你正在查看现有的内存数组)那么,虽然最终结果相同,但性能却明显不同.我跑了一些基准,实际上对结果感到惊讶.我会假设array.First()比array.Where(…)更高效.第一个(),但我发现它是另一种方式.
我创建了一个测试,看看遍历数组需要多长时间,我把搜索项放在数组的最后一个.我对每个测试进行了200次测试,每次测试包含1000次迭代. Ticks的平均结果是:
First() = 2655969 Where().First() = 1455211
正如你所看到的Where().First()大约只占First()的一半时间.
我的基准测试应用程序如下:
class Program { private const int internalIterations = 1000; private const int externalIterations = 100; private const int dataSize = 100000; private const int search = dataSize - 1; private static readonly long[] resultsFirst = new long[externalIterations*2]; private static readonly long[] resultsWhereFirst = new long[externalIterations*2]; private static readonly int[] data = Enumerable.Range(0,dataSize).ToArray(); static void Main(string[] args) { Stopwatch sw = new Stopwatch(); for (int i = 0; i < externalIterations; i++) { Console.WriteLine("Iteration {0} of {1}",i+1,externalIterations); sw.Restart(); First(); sw.Stop(); resultsFirst[i*2] = sw.ElapsedTicks; Console.WriteLine(" First : {0}",sw.ElapsedTicks); sw.Restart(); WhereFirst(); sw.Stop(); resultsWhereFirst[i*2] = sw.ElapsedTicks; Console.WriteLine("WhereFirst : {0}",sw.ElapsedTicks); sw.Restart(); WhereFirst(); sw.Stop(); resultsWhereFirst[(i*2)+1] = sw.ElapsedTicks; Console.WriteLine("WhereFirst : {0}",sw.ElapsedTicks); sw.Restart(); First(); sw.Stop(); resultsFirst[(i*2)+1] = sw.ElapsedTicks; Console.WriteLine(" First : {0}",sw.ElapsedTicks); } Console.WriteLine("Done!"); Console.WriteLine("Averages:"); Console.WriteLine(" First Average: {0:0.00}",resultsFirst.Average()); Console.WriteLine("WhereFirst Average: {0:0.00}",resultsWhereFirst.Average()); } private static void WhereFirst() { for (int i = 0; i < internalIterations; i++) { int item = data.Where(d => d == search).First(); } } private static void First() { for (int i = 0; i < internalIterations; i++) { int item = data.First(d => d == search); } } }
更新
我尝试使用List而不是数组作为数据源,发现它更慢.
数据创建行如下所示:
private static readonly List<int> data = Enumerable.Range(0,dataSize).ToList();
最终的结果是:
First() = 3222609 Where().First() = 2124652