【问题标题】:Get row index in datatable from a certain column从某一列获取数据表中的行索引
【发布时间】:2012-12-06 19:42:54
【问题描述】:
| 1 | 2 | 3 |
+------------+
| A | B | C |
| D | E | F | 
| G | H | I |

System.Data.DataTable dt = new DataTable();

dt.Columns.Add("1");
dt.Columns.Add("2");
dt.Columns.Add("3");
dt.Rows.Add(new object[] { "A", "B", "C" });
dt.Rows.Add(new object[] { "D", "E", "F" });
dt.Rows.Add(new object[] { "G", "H", "I" });

int? index = null;

var rows = new System.Data.DataView(dt).ToTable(false, new[] {"1"}).Rows;

for (var i = 0; i < rows.Count; i++)
{
    if (rows[i].ItemArray.FirstOrDefault() as string == "A")
        index = i;
}

有没有什么方法可以简化这段代码来获取某一行的索引,并提供一个列?在这种情况下,索引将是0,因为我正在遍历第一列,直到找到“A”。感觉应该有一个linq解决方案,但我想不通。

【问题讨论】:

    标签: c# asp.net sql database


    【解决方案1】:

    如果您使用DataTableExtensions.AsEnumerable() 方法,您将能够使用 LINQ 查询您的 DataTable。然后您可以使用List&lt;T&gt;.FindIndex 来确定给定谓词的索引:

    int? index = new System.Data.DataView(dt).ToTable(false, new[] { "1" })
                    .AsEnumerable()
                    .Select(row => row.Field<string>("1")) // ie. project the col(s) needed
                    .ToList()
                    .FindIndex(col => col == "G"); // returns 2
    

    【讨论】:

      【解决方案2】:

      您应该可以像这样使用DataTable.Select 方法:

      DataRow[] foundRows;
      string filter = "1 == A";
      foundRows = dt.Select(filter);
      
      foreach (DataRow dr in foundRows)
      {
          Console.WriteLine("Index is " + dr.Table.Rows.IndexOf(dr));
      }
      

      【讨论】:

        【解决方案3】:
        var index = from row in dt.AsEnumerable()
                    let r = row.Field<string>("1")
                    where r == "A"
                    select dt.Rows.IndexOf(row);
        

        【讨论】:

        • 那么如何将索引用作 int 呢?
        • IndexOf 返回一个int
        • 仍然是 var,将其更改为 int 会产生错误,将 index 作为 var 用于期望 int 的方法也会产生错误:(
        • 我假设您的问题是索引实际上是 EnumerableRowCollection&lt;int&gt;?调用者有责任确保您只有一条记录(如果这是您所期望的)并获取该记录中的任何值,在本例中为 int
        • 是的,无法从 转换为 int,所以我不得不使用 foreach,即使它肯定只包含一条记录。改进提示?我可以直接投射或解析它吗?
        【解决方案4】:

        您可以尝试使用标识列。但是,我不了解您的应用程序,因此请考虑在数据表中添加标识列的利弊。这是一个帮助您入门的参考 - how to add identity column

        希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          使用 linq 操作,但你的目标框架应该是 4.5。 导入 system.Data.DataExtensions 并应用 linq 查询将帮助您。

          【讨论】:

            猜你喜欢
            • 2022-06-29
            • 2019-11-16
            • 2019-03-17
            • 2014-04-27
            • 1970-01-01
            • 1970-01-01
            • 2021-05-13
            • 2019-01-02
            • 1970-01-01
            相关资源
            最近更新 更多