【问题标题】:How to get Index in Datatable如何获取数据表中的索引
【发布时间】:2014-05-22 09:09:48
【问题描述】:

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

Column 1 Column 2 Column 3 Column 4 Column 5 Column 6
RowX 1 12 0
RowX 2 12 0
RowX 3 12 0
RowY 3 12 1
RowY 1 12 1

我想得到这一行的索引

行X | 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();

这不起作用,因为参数 1:无法从“System.Data.EnumerableRowCollection”转换为“int”。如何获取索引?

还有其他方法可以实现吗?

【问题讨论】:

    标签: c# linq datatable


    【解决方案1】:

    Enumerable.Where返回多个元素,本例为IEnumerable&lt;int&gt;,可以使用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;
    // ...
    

    【讨论】:

      【解决方案2】:

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

      您在第一行将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();
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-10
        • 1970-01-01
        • 2015-10-02
        • 2015-08-23
        • 1970-01-01
        • 2011-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多