gpt4 book ai didi

c# - LINQ 与方法表达式的差异

转载 作者:太空狗 更新时间:2023-10-29 20:59:32 25 4
gpt4 key购买 nike

为什么 Linq 表达式 IL 导致遗漏了 Select 投影,而相应的方法表达式保留了 Select 投影?

我想这两段代码的作用相同。

 var a = from c in companies
where c.Length >10
select c;

//

var b = companies.Where(c => c.Length > 10).Select(c => c);

//IL - LINQ

IEnumerable<string> a = this.companies.
Where<string>(CS$<>9__CachedAnonymousMethodDelegate1);

//IL

IEnumerable<string> b = this.companies.Where<string>
(CS$<>9__CachedAnonymousMethodDelegate4).Select<string, string>
(CS$<>9__CachedAnonymousMethodDelegate5);

那为什么 IL 有差异呢?

已编辑: 那为什么

  var a = from c in companies
select c;

即使在 IL 内部也会导致 SELECT 投影。也可以省略吧?

最佳答案

C# 编译器很聪明,可以从 Linq 中删除无用的语句。 Select c 没有用,所以编译器将其删除。当您编写 Select(c=>c) 时,编译器不能说该指令无用,因为它是一个函数调用,因此它不会删除它。如果您自己删除它,IL 将变得相同。

编辑:Linq 是一种“描述性”语言:你说你想要什么,编译器会很好地转换它。您无法控制该转换。编译器尝试优化函数调用并且不使用 Select 因为您不进行投影所以它没用。当您编写 Select(c => c) 时,您会显式调用一个函数,这样编译器就不会删除它。

var a = from c in companies select c;
var a = c.Select(elt=>elt);

选择在这个例子中很有用。如果删除它,则 a 具有 c 的类型;否则 a 是一个 IEnumerable

关于c# - LINQ 与方法表达式的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7592996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com