1

DataGridView所有,我在(DGV)中有行。为了测试添加到此 DGV 的项目是否已经存在,我编写了一个方法,该方法使用以下 LINQ 查询返回匹配行的行索引(而不是for/foeach循环):

IEnumerable<int> rowCol = this.dataGridViewAttachList.Rows.Cast<DataGridViewRow>()
    .Where(row => row.Cells[(int)DgvColumns.DatabaseName].Value.ToString()
        .Equals(databaseName, StringComparison.OrdinalIgnoreCase))
    .Select(row => row.Index);

我的问题是:为什么我必须使用 投射Cast<DataGridViewRow>()我第一次尝试不使用它,但我花了一段时间才解决这个问题。但我不清楚为什么有必要?

谢谢你的时间。

4

3 回答 3

5

这是因为DataGridViewRowCollectionimplementsIEnumerable而不是IEnumerable<DataGridViewRow>.

于 2012-11-22T21:39:38.920 回答
1

DataGridView.Rows 是类型DataGridViewRowCollection,它实现了IEnumerable. LINQ 扩展方法需要IEnumerable<T>.

于 2012-11-22T21:39:59.897 回答
1

这是因为DataGridViewRowCollection( Rows 属性的类型)是 nongeneric IEnumerableIEnumerable<DataGridViewRow>因此,要获得linq 可以使用的通用版本,您应该调用 .Cast<DataGridViewRow>()

于 2012-11-22T21:43:24.643 回答