gpt4 book ai didi

c# - Linq投影如何在扩展方法和查询表达式之间工作

转载 作者:太空宇宙 更新时间:2023-11-03 23:13:56 24 4
gpt4 key购买 nike

摆弄Linq,令我惊讶的是我遇到了以下情况:

var words = new List<string>() {"seven", "ten", "one" ,"five"};

var test1 = words.OrderBy(w => w.Length);
var test2 = words.OrderBy(w => w.Lenght).Select(w => w);
var test3 = from w in words
orderby w.Length
select w;

VS 调试告诉我

test1: System.Linq.IOrderedEnumerable<string>
test2: System.Collections.Generic.IEnumerable<string>
test3: System.Linq.IOrderedEnumerable<string>

我期待 test2test3 的类型相同,天哪!编译器,或者其他什么,不这么认为。

  1. 任何人都可以解释一下吗?
  2. 此外,在任何情况下,只要我投影到同一类型,我会更喜欢 test2 而不是 test1 吗?即 Select(w => w)

最佳答案

编译器忽略了对 Select 的调用当 select 中没有真正的转换时查询表达式的子句。这就是 test1 中查询的原因和 test3是等价的。

我的回答基于 Jon Skeet 博客中的这篇文章(阅读查询表达式 段落): LINQ to Objects

var result = from x in source
where x < 4
select x;

(...) we’re not actually performing a real transformation. In that case – and so long as there’s something else in the query, in this case our "where" clause – the compiler effectively omits the "select" clause (...)

关于你问题的第二部分,当你调用 Select 时最后,你会得到一个 IEnumerable<T> ,因为这就是 Select返回。 IOrderedEnumerable<T>延伸IEnumerable<T> ,因此通过在最后进行投影,您将失去使用 IOrderedEnumerable<T> 成员的能力。界面。

关于c# - Linq投影如何在扩展方法和查询表达式之间工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37919227/

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