LINQ扩展方法的顺序不影响性能?我很惊讶在LINQ扩展方法之前添加或附加并不重要。使用Enumerable.FirstOrDefault测试:hugeList.Where(x=>x.Text.Contains("10000")).FirstOrDefault();hugeList.FirstOrDefault(x=>x.Text.Contains("10000"));varhugeList=Enumerable.Range(1,50000000).Select(i=>new{ID=i,Text="Item"+i});varsw1=newSystem.Diagnostics.Stopwatch();varsw2=newSystem.Diagnostics.Stopwatch();sw1.开始();for(inti=0;ix.Text.Contains("10000")).FirstOrDefault();sw1.停止();sw2.开始();for(inti=0;ix.Text.Contains("10000"));sw2.停止();varresult1=String.Format("FirstOrDefaultafter:{0}FirstOrDefaultbefore:{1}",sw1.Elapsed,sw2.Elapsed);//result1:FirstOrDefaultafter:00:00:03.3169683FirstOrDefaultbefore:00:00:03.0463219sw2.Restart();对于(inti=0;ix.Text.Contains("10000"));sw2.停止();sw1.重启();对于(inti=0;ix.Text.Contains("10000")).FirstOrDefault();sw1.停止();varresult2=String.Format("FirstOrDefaultbefore:{0}FirstOrDefaultafter:{1}",sw2.Elapsed,sw1.已过去);//result2:FirstOrDefaultbefore:00:00:03.6833079FirstOrDefaultafter:00:00:03.1675611//averageafter:3.2422647before:3.3648149(allseconds)我猜之前它会更慢,因为它必须找到所有匹配项目,然后取第一个和前面的FirstOrDefault可以产生第一个找到的项目问:有人可以解释为什么我走错路了吗?我猜想在它前面加上它会比较慢,因为它必须找到所有匹配的项目,然后取第一个并且在前面加上FirstOrDefault可以产生第一个找到的项目。有人可以解释为什么我走错路了吗?您走错了路,因为您的第一个陈述不正确。Where不必在Where获得第一个匹配项之前找到所有匹配项。在哪里“按需”获取匹配项;如果你只要求第一个,它只会获取第一个。如果你只要求前两个,它只需要前两个。JonSkeet在舞台上表现出色。假设你有三个人。第一个人有一副洗好的牌。第二个人有一件T恤,上面写着“卡片是红色的”。第三个人戳第二个人说“给我第一张牌”。第二个人一遍又一遍地戳第一个人,直到第一个人交出红牌,然后第二个人递给第三个人。第二个人没有理由继续戳第一个人;任务完成!现在,如果第二个人的T恤上写着“按升序排序”,我们的情况就会大不相同。现在,第二个人确实需要从第一个人那里拿到每张牌,以便在将第一张牌交给第三个人之前找到牌组中最低的一张牌。现在,这应该为您提供必要的直觉,让您了解订单何时因性能原因而变得重要。“给我红牌并排序”与“将所有牌排序并给我红牌”的最终结果完全相同,但它更快,因为您不必花时间对要丢弃的黑牌进行排序.Where()方法使用延迟执行并在请求时提供下一个匹配项。也就是说,Where()不会立即评估并返回所有候选项的序列,而是在迭代时一次提供一个。由于FirstOrDefault()在第一项之后停止,这将导致Where()停止迭代。将FirstOrDefault()视为暂停Where()的执行,就像休息一样。当然,并没有那么简单,但本质上,由于FirstOrDefault()在找到一个项目后停止迭代,所以Where()不需要继续。当然,这是在Where()子句上应用FirstOrDefault()的简单情况,如果您有其他子句暗示需要考虑所有项目,这可能会产生影响,但使用Where().FirstOrDefault()'组合或只是带有谓词的FirstOrDefault()'。以上是C#学习教程:DoesLINQextensionmethodsoftheorderofperformance?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
