Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Linq Where(表达式).FirstorDefault()与FirstorDefault(表达式)_C#_Linq - Fatal编程技术网

C#Linq Where(表达式).FirstorDefault()与FirstorDefault(表达式)

C#Linq Where(表达式).FirstorDefault()与FirstorDefault(表达式),c#,linq,C#,Linq,这两个Linq查询之间的区别是什么: var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault(); // vs. var result = ResultLists().FirstOrDefault( c => c.code == "abc"); 语义完全相同吗 如果语义相等,则与Where()加上普通FirstOrDefault()相比,它提供的性能在理论上或实践上是否有任何好处 第二个。在所有其

这两个Linq查询之间的区别是什么:

var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault();
// vs.
var result = ResultLists().FirstOrDefault( c => c.code == "abc");
  • 语义完全相同吗
  • 如果语义相等,则与
    Where()
    加上普通
    FirstOrDefault()
    相比,它提供的性能在理论上或实践上是否有任何好处

  • 第二个。在所有其他条件相同的情况下,第二种情况下的迭代器可以在找到匹配项后立即停止,其中第一个迭代器必须找到所有匹配项,然后选择其中的第一个。

    两者都可以

    它们都是懒洋洋地运行的——如果源列表有一百万个项目,但是第十个项目匹配,那么它们都只会迭代源列表中的10个项目


    性能应该几乎相同,任何差异都是完全不重要的。

    其中
    实际上是一个延迟执行-这意味着,表达式的计算将延迟到实际需要其实现值为止。它通过避免不必要的执行大大提高了性能

    其中
    看起来有点像这样,并返回一个新的IEnumerable

    foreach (var item in enumerable)
    {
        if (condition)
        {
            yield return item;
        }
    }
    

    FirstOrDefault()
    返回
    并且在没有结果时不抛出任何异常或返回null

    很好的讨论,以上所有答案都是正确的

    我没有运行任何性能测试,但根据我的经验,FirstOrDefault()有时比Where()更快,也更优化。FirstOrDefault()

    我最近修复了内存溢出/性能问题(“神经网络算法”),并且修复了(x->…).FirstOrDefault()更改为简单的FirstOrDefault(x->…)

    我忽略了编辑关于将Where(x->…).FirstOrDefault()更改为FirstOrDefault(x->…)的建议

    因此,我相信上述问题的正确答案是


    第二个选项在所有情况下都是最好的方法

    我认为
    会导致“投影”或“惰性枚举序列”(虽然开销可能稍高,但不需要从
    结果列表
    中运行更多的元素,请参见结尾注释),但在大多数情况下我选择后者。。。。在LINQ2SQL或类似的情况下,我不知道查询生成器会做什么。不正确-LINQ的链接行为意味着它会延迟迭代。对于这两种方法,如果第一项是匹配项,则它们不会再进一步。@Enigmativity:并非所有Linq提供程序都是这样。虽然Linq to对象也是如此,但基于SQL基础的提供程序必须在返回第一个对象之前返回(或至少处理)整个集合。底线是,不管某些提供者提供了什么样的底层优化,因为你不能相信它在所有情况下都是正确的,所以最好是在概念上总是提供正确的行为,所有其他条件都是一样的。@DaveC-你会期望最基本的提供者会发现
    FirstOrDefault
    应该返回
    TOP 1
    项,当然?我开始在一个大数据集上使用
    Where(query).FirstOrDefault()
    获得“等待操作超时”。当我把它改为
    FirstOrDefault(query)
    时,我不再看到它;所以也许这个答案有些道理。不管怎样,代码的可读性稍好一些。使用第二个代码简洁。@nawfal-我想说使用第一个代码简洁。没有什么区别是无关紧要的-每天500个用户调用1000个项目加起来需要花费大量时间。@new野心-你说的不到一天的百分之一。时间不多。当我比较这两种方法时,我得到的差异是,对于超过150000个项目,结果是1ms(不是每个项目1ms,而是所有150000个项目1ms)。因此,基于500 x 1000项查询,每天大约0.003ms。这并不重要。我认为这个词应该是斜体,而不是粗体:|你是对的,尽管我用了一个夸张的例子。我并不是想让自己听起来很难受,只是有时候性能上的微小变化会累加起来:)我的代码编辑器会检测到(X)+First()的位置,并建议先写(X),而不是0.003ms——我想你应该写3ms。“一天的百分之一”是一个非常糟糕的指标。如果你每天8小时内有100次大约3秒的随机延迟,这只是时间的1%,但你想在一天结束时把电脑扔出窗外。