取
var query = Process.GetProcesses()
.OrderBy(p => p.WorkingSet64)
.ThenByDescending(p => p.Threads.Count);
.Where(p => p.ProcessName.Length < 9);
工作正常。取
var query = Process.GetProcesses()
.OrderBy(p => p.WorkingSet64)
.ThenByDescending(p => p.Threads.Count);
//.Where(p => p.ProcessName.Length < 9);
query = query.Where(p => p.ProcessName.Length < 9);
这不起作用。我不明白为什么第一种方法有效。在我看来,这些查询是相同的。 ThenByDescending返回IOrderedEnumerable<T>
,它被传送到Where()。第一种方法不起作用,因为其中只适用于IEnumerable<T>
。唉......它确实有用。
此处理管道如何运作?
答案 0 :(得分:8)
不同之处在于对var
关键字和LINQ查询的误解。
使用var
关键字与指定与分配右侧相同的类型相同。这并不意味着您可以为变量分配任何类型。
在LINQ查询中,大多数基本表达式返回IEnumerable
,但在很多情况下,它们不返回IEnumerable
。相反,它们返回一个继承自IEnumerable
。
在这种情况下,您正在做相同的事情:
IEnumerable<Process> query = Process.GetProcesses()
.OrderBy(p => p.WorkingSet64)
.ThenByDescending(p => p.Threads.Count);
.Where(p => p.ProcessName.Length < 9);
和
IOrderedEnumerable<Process> query = Process.GetProcesses()
.OrderBy(p => p.WorkingSet64)
.ThenByDescending(p => p.Threads.Count);
// Won't work because Where doesn't return an IOrderedEnumerable.
query = query.Where(p => p.ProcessName.Length < 9);
第一个代码段的工作原因是因为IOrderedEnumerable
继承自IEnumerable
,所以您可以这样使用它。
要解决第二个示例中的问题,您需要明确声明query
为IEnumerable<Process>
。