全部,我在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>()
进行投射?我首先尝试过没有它,我花了一段时间来解决这个问题;但我不清楚为什么有必要呢?
感谢您的时间。
答案 0 :(得分:5)
这是因为DataGridViewRowCollection
实现了IEnumerable
而不是IEnumerable<DataGridViewRow>
。
答案 1 :(得分:1)
DataGridView
。行的类型为DataGridViewRowCollection
,实现IEnumerable
。 LINQ扩展方法需要IEnumerable<T>
。
答案 2 :(得分:1)
这是因为DataGridViewRowCollection
(Rows属性的类型)是非通用的IEnumerable
。因此,要获得linq可以使用的通用版IEnumerable<DataGridViewRow>
,您应该调用。Cast<DataGridViewRow>()