如何在Datatable中获取索引

时间:2014-05-22 09:09:49

标签: c# linq datatable

我需要一些帮助,例如我的数据表中有以下项目

第1栏|第2栏|第3栏|第4栏|第5栏|第6栏

RowX | 1 | 12 | 0 | |

RowX | 2 | 12 | 0 | |

RowX | 3 | 12 | 0 | |

RowY | 3 | 12 | 1 | |

RowY | 1 | 12 | 1 | |

我希望得到这一行的索引

RowX | 3 | 12 | 0 | |

因为我想更新此行的第5列和第6列。如果我使用上面的查询,如

var index = from row in DataTable1.AsEnumerable()
let r = row.Field<string>("Column1")
let s = row.Field<int>("Column2")
let t = row.Field<string>("Column3")
let u = row.Field<string>("Column4")
where r == DataRowX && s == 12 && t == 3 && u == 0
select DataTable1.Rows.IndexOf(row);

DataTable1.Rows[index]["Column5"] = intUpdateValueColumnx;
DataTable1.Rows[index]["Column6"] = intUpdateValueColumny;
DataTable1.AcceptChanges();

这不起作用,因为Argument 1:无法从'System.Data.EnumerableRowCollection'转换为'int'。如何获得索引?

还有另一种方法可以达到这个目的吗?

提前感谢...

2 个答案:

答案 0 :(得分:0)

index应为int,表示您要更改的行的位置或“索引”。

您正在使用第一行<{1}}将index设置为EnumerableRowCollection

var index = from row in DataTable1.AsEnumerable()
let r = row.Field<string>("Column1")
let s = row.Field<int>("Column2")
let t = row.Field<string>("Column3")
let u = row.Field<string>("Column4")
where r == DataRowX && s == 12 && t == 3 && u == 0
select DataTable1.Rows.IndexOf(row);

所以index实际上是一组索引。


您可能想要做类似的事情,

foreach (var row in DataTable1.AsEnumerable().Where(r =>
        r.Field<string>("Column1") == DataRowX &&
        r.Field<int>("Column2") == 12 &&
        r.Field<string>("Column3") == "3" &&
        r.Field<string>("Column4") == "0"))
{
    row.SetField("Column5", intUpdateValueColumnx);
    row.SetField("Column6", intUpdateValueColumny);
}

DataTable1.AcceptChanges();

这将更新符合条件的所有行。可能有很多或没有。

答案 1 :(得分:0)

Enumerable.Where返回多个元素,在本例中为IEnumerable<int>,您可以使用foreach枚举所有元素:

foreach(int index in indices) // renamed index to indices
{
    DataTable1.Rows[index]["Column5"] = intUpdateValueColumnx;
    DataTable1.Rows[index]["Column6"] = intUpdateValueColumny;
}
DataTable1.AcceptChanges();

如果你确定它只包含一个,你可以使用FirstSingle(多次抛出异常)。

int firstIndex = indices.First();
DataTable1.Rows[firstIndex]["Column5"] = intUpdateValueColumnx;
// ...