为什么我必须调用Cast<> DataGridViewRow上的扩展方法?

时间:2010-10-28 20:28:50

标签: c# .net winforms linq datagridview

这不起作用。

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?它并没有给我带来任何实际问题,但我想更好地理解它。

1 个答案:

答案 0 :(得分:6)

是的,这正是因为它所宣传的界面。 LINQ中的几乎所有扩展方法都适用于IEnumerable<T>而不是IEnumerableCast<>是弥合这一差距的一种方式 - 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?;

编译器将其转换为与第二个样本完全相同的代码。