gpt4 book ai didi

linq - Linq 如何在 IOrderedEnumerable 方法之后使用 IEnumerable 方法?

转载 作者:行者123 更新时间:2023-12-01 09:10:26 30 4
gpt4 key购买 nike

在 Linq 中,扩展方法如 Where返回 IEnumerable集合,但排序方法如 OrderBy返回 IOrderedEnumerable收藏。

因此,如果您有一个以 OrderBy 结尾的查询(即返回 IOrderedEnumerable ),以后不能附加 Where方法 - 编译器提示传递给 Where 的类型.

var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);

query = query.Where(p => p.ProcessName.Length < 5);

但是,如果您在一个查询中完成所有操作,那很好!
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id)
.Where(p => p.ProcessName.Length < 5);

我查看了 Reflector 中的程序集,看看编译器是否重新排序了任何操作,但似乎没有。这是如何运作的?

最佳答案

IOrderedEnumerable<T>扩展 IEnumerable<T>所以你仍然可以使用任何扩展方法。您的第一个代码块不起作用的原因是您有效地编写了:

IOrderedEnumerable<Process> query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);

// Fail: can't assign an IEnumerable<Process> into a variable
// of type IOrderedEnumerable<Process>
query = query.Where(p => p.ProcessName.Length < 5);

失败是因为 query.Where(...)只返回 IEnumerable<Process> , 不能分配给 query多变的。它不是在调用 Where这就是问题所在 - 它将结果分配回原始变量。为了证明这一点,这段代码可以正常工作:
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);

// Introduce a new variable instead of trying to reuse the previous one
var query2 = query.Where(p => p.ProcessName.Length < 5);

或者,您可以将查询声明为 IEnumerable<T>开始:
IEnumerable<Process> query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);

// Fine
query = query.Where(p => p.ProcessName.Length < 5);

关于linq - Linq 如何在 IOrderedEnumerable 方法之后使用 IEnumerable 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1559113/

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