采取
var query = Process.GetProcesses()
.OrderBy(p => p.WorkingSet64)
.ThenByDescending(p => p.Threads.Count);
.Where(p => p.ProcessName.Length < 9);
Run Code Online (Sandbox Code Playgroud)
它工作正常.采取
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);
Run Code Online (Sandbox Code Playgroud)
这不起作用.我不明白为什么第一种方法有效.在我看来,这些查询是相同的.ThenByDescending返回IOrderedEnumerable<T>通过管道输入Where().第一种方法不应该起作用,因为Where只适用于IEnumerable<T>.唉......它确实有效.
这个处理管道如何运作?
不同之处在于对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);
Run Code Online (Sandbox Code Playgroud)
和
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);
Run Code Online (Sandbox Code Playgroud)
第一个代码段工作原因是因为IOrderedEnumerable继承自IEnumerable,所以你可以这样使用它.
要解决第二个示例中的问题,您需要显式声明query为IEnumerable<Process>.