IOrderedEnumerable<T>
延伸
IEnumerable<T>
所以您仍然可以使用任何扩展方法。第一块代码不起作用的原因是您有效地编写了:
IOrderedEnumerable<Process> query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);
// Fail: can't assign an IEnumerable<Process> into a variable
// of type IOrderedEnumerable<Process>
query = query.Where(p => p.ProcessName.Length < 5);
失败是因为
query.Where(...)
只返回一个
IEnumerable<Process>
,不能分配给
query
变量。它不打电话
Where
这就是问题所在——它将结果分配回原始变量。为了证明这一点,此代码可以正常工作:
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);
// Introduce a new variable instead of trying to reuse the previous one
var query2 = query.Where(p => p.ProcessName.Length < 5);
或者,可以将查询声明为
IEnumerable<t>
首先:
IEnumerable<Process> query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);
// Fine
query = query.Where(p => p.ProcessName.Length < 5);