这不起作用。
var result =
from row in grid.Rows
where (string) row.Cells["COLUMN_1"].Value == "Test"
select row.Cells["COLUMN_2"].Value as int?;
但是这样做。
var result =
from row in grid.Rows.Cast<DataGridViewRow>()
where (string) row.Cells["COLUMN_1"].Value == "Test"
select row.Cells["COLUMN_2"].Value as int?;
据我所知,DataGridViewRowCollection是DataGridViewRows的集合。那么为什么我必须先将每个成员转换为DataGridViewRow才能访问其属性?
是否与DataGridViewRowCollection实现非通用IEnumerable
而非通用版本IEnumerable<DataGridViewRow>
的事实有关?或者它显然在内部使用ArrayList
?它并没有给我带来任何实际问题,但我想更好地理解它。
答案 0 :(得分:6)
是的,这正是因为它所宣传的界面。 LINQ中的几乎所有扩展方法都适用于IEnumerable<T>
而不是IEnumerable
。 Cast<>
是弥合这一差距的一种方式 - OfType<>
是另一种方式。
但是,有一种更简单的方法可以调用Cast<T>
- 只需显式输入你的范围变量:
var result =
from DataGridViewRow row in grid.Rows
where (string) row.Cells["COLUMN_1"].Value == "Test"
select row.Cells["COLUMN_2"].Value as int?;
编译器将其转换为与第二个样本完全相同的代码。