C# 不同linq使用顺序之间是否存在性能差异?
C# 不同linq使用顺序之间是否存在性能差异?,c#,performance,linq,C#,Performance,Linq,IEnumerable.Cast().FirstOrDefault() vs IEnumerable.FirstOrDefault().Cast() 我问这个问题的原因是,我在网上看到很多第一次使用它的例子。 但是,第二个linq序列在性能方面是否更好,因为它避免了在IEnumerable第一个序列中强制转换所有元素?或者第一个更安全?还是他们在后台做的完全一样?IEnumerable.Cast().FirstOrDefault()可能是您想要的,但答案与性能无关 除非Element是IEnum
IEnumerable.Cast().FirstOrDefault()代码>
vs
IEnumerable.FirstOrDefault().Cast()代码>
我问这个问题的原因是,我在网上看到很多第一次使用它的例子。
但是,第二个linq序列在性能方面是否更好,因为它避免了在IEnumerable第一个序列中强制转换所有元素?或者第一个更安全?还是他们在后台做的完全一样?IEnumerable.Cast().FirstOrDefault()
可能是您想要的,但答案与性能无关
除非Element
是IEnumerable
,否则对FirstOrDefault()
的结果使用Cast()
是没有意义的,并且会导致编译错误
假设您的意思是(SomeClass)(IEnumerable.FirstOrDefault())
对于第二种情况,这也是有问题的,因为如果IEnumerable
为空,那么FirstOrDefault()
将返回null
(如果元素
是引用类型),或者默认构造元素
(如果它是值类型)。如果IEnumerable
为空且SomeClass
为值类型,则最好使用默认构造SomeClass
,而不是尝试从元素
强制转换为SomeClass
IEnumerable.Cast().FirstOrDefault()
最多只能执行一次从元素
到SomeClass
的强制转换,因为LINQ链是惰性枚举的。第二个也不会编译。您需要编写(对象)IEnumerable.FirstOrDefault()
。或IEnumerable.Take(1.Cast().FirstOrDefault()
@PatrickRoberts所以如果我理解正确,当IEnumerable
可能为空或向下投射时,第一个更安全。但是,如果我们确保提供了一个非空的巨型IEnumerable
+确保它不是一个沮丧的人,那么第二个可能会更快一些?庞大甚至重要吗?这是延期执行。@GuruStron啊,对了!在这种情况下,让.Take(1)
比第一个运行得更快吗?@PatrickRoberts“如果IEnumerable为空,第一个将使用默认构造函数构造SomeClass
”只有在SomeClass
为值类型时才正确。“然后FirstOrDefault()将默认构造元素
”-如果元素
是引用类型-否,它将不会构造它。@GuruStron我们通常仍将该引用类型行为称为构造,或者至少生成一个默认值,该值恰好为null
@GuruStron抱歉,你是对的。自从我在C语言工作了一段时间,我的C++语义一直停留在我脑海中。我会说延迟和不懒惰,因为它们在所有情况下都是不平等的。基本上,您不必担心Cast
或Select
等。在进行后续调用(Where
,等等)之前,您可以枚举整个集合,因为元素是生成的。@AluanHaddad个人从未听说过在引用类型的默认值方面使用术语“construct(ed)”。另外,null
的向下转换通常没有问题。