0

        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() 中的内容。第一种方法不应该工作,因为 Where 只适用于IEnumerable<T>. 唉......它确实有效。

这个处理管道如何运作?

4

1 回答 1

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);

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

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

于 2012-04-09T21:49:32.980 回答