在 Linq 中,扩展方法像Where
返回一个IEnumerable
集合,而排序方法像OrderBy
返回一个IOrderedEnumerable
集合。
OrderBy
因此,如果您有一个以(即返回一个)结尾的查询,那么您IOrderedEnumerable
以后不能附加一个Where
方法——编译器会抱怨传递给的类型Where
。
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);
query = query.Where(p => p.ProcessName.Length < 5);
但是,如果您在一个查询中完成所有操作,那很好!
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id)
.Where(p => p.ProcessName.Length < 5);
我查看了 Reflector 中的程序集,看看编译器是否重新排序了任何操作,但似乎没有。这是如何运作的?