Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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/0/performance/5.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使用顺序之间是否存在性能差异?_C#_Performance_Linq - Fatal编程技术网

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
的向下转换通常没有问题。