c# – 使用.First()和.Where()之间的区别.第一个()
发布时间:2020-12-16 01:55:15 所属栏目:百科 来源:网络整理
导读:这有什么区别: myList.Where(item = item == 0).First(); 还有这个: myList.First(item = item == 0); 后者对我来说更有意义,因为它更短,但我似乎更频繁地看到顶级版本. 解决方法 这取决于.如果LINQ正在转换为SQL,那么它取决于如何处理转换.如果你正在使用
这有什么区别:
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |