了解处理管道

时间:2012-04-09 21:33:23

标签: c# linq

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

此处理管道如何运作?

1 个答案:

答案 0 :(得分:8)

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

var (C# reference)

使用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>