了解处理管道

P.B*_*key 0 c# linq

采取

        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>.唉......它确实有效.

这个处理管道如何运作?

Ken*_*rey 8

不同之处在于对var关键字和LINQ查询的误解.

var(C#参考)

使用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,所以你可以这样使用它.

要解决第二个示例中的问题,您需要显式声明queryIEnumerable<Process>.