作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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);
最佳答案
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);
关于linq - Linq 如何在 IOrderedEnumerable 方法之后使用 IEnumerable 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1559113/
我是一名优秀的程序员,十分优秀!