2012-11-22 42 views
1

所有,我有DataGridView(DGV)中的行。为了测试是否被添加到这个DGV该项目是已经存在我写它采用以下LINQ查询返回匹配行(而不是for/foeach环路)的行索引的方法:LINQ行索引检索铸造要求

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>()进行施放?我第一次尝试没有它,它花了我一段时间来解决这个问题。但是我不清楚为什么这是必要的?

谢谢你的时间。

回答

5

这是因为DataGridViewRowCollection执行IEnumerable而不是IEnumerable<DataGridViewRow>

1

DataGridView。行的类型为DataGridViewRowCollection,它实现IEnumerable。 LINQ扩展方法需要IEnumerable<T>

1

这是因为DataGridViewRowCollection(Rows属性的类型)是非通用的IEnumerable。所以要获得可由linq使用的通用版本IEnumerable<DataGridViewRow>,您应该调用。 Cast<DataGridViewRow>()