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