【问题标题】:Compare DataRow collection to List<T>将 DataRow 集合与 List<T> 进行比较
【发布时间】:2010-01-05 11:19:59
【问题描述】:

我有一个 List&lt;string&gt; 和一个 DataTable。

DataRow 中的一列是 ID。 List 包含此 ID 的实例。

DataTable 在 Timer 上填充。

我想将列表中不在 DataTable 中的项目返回到另一个列表中。

【问题讨论】:

    标签: c# linq c#-3.0 datatable datarow


    【解决方案1】:

    你会想做这样的事情

    var tableIds = table.Rows.Cast<DataRow>().Select(row => row["ID"].ToString());
    
    var listIds = new List<string> {"1", "2", "3"};
    
    return listIds.Except(tableIds).ToList();
    

    您可以将数据表中的行转换为 IEnumerable 集合,然后从每个行中选择“ID”列值。然后,您可以使用 Enumerable.Except 扩展方法从 List 中获取不在您刚刚创建的集合中的所有值。

    如果您需要获取表中而不是列表中的值,只需反转 listIds 和 tableIds。

    【讨论】:

    • +1 .Cast 是我缺少的所有这些精彩扩展方法的链接。
    【解决方案2】:

    如果你的桌子是这样的:

    DataTable dt = new DataTable();
    dt.Columns.Add("ID");
    DataRow dr = dt.NewRow();
    dt.PrimaryKey = new DataColumn[] {dt.Columns[0]};
    dr["ID"] = "1";
    dt.Rows.Add(dr);
    dr = dt.NewRow();
    dr["ID"] = "2";
    dt.Rows.Add(dr);
    dr = dt.NewRow();
    dr["ID"] = "3";
    dt.Rows.Add(dr);
    

    列表是这样的:

    List<string> ls = new List<string>{"1","2","4"};
    

    我们可以通过这种方式获取列表中而不是数据表中的项目:

    var v = from r in ls
                    where !dt.Rows.Contains(r)
                    select r;
            v.ToList();
    

    【讨论】:

      【解决方案3】:

      通过HashSet&lt;T&gt; 以合理的效率(并注意从DataRow 获取数据的最快方法是通过DataColumn 索引器):

              HashSet<int> ids = new HashSet<int>();
              DataColumn col = table.Columns["ID"];
              foreach (DataRow row in table.Rows)
              {
                  ids.Add((int)row[col]);
              }
              var missing = list.Where(item => !ids.Contains(item.ID)).ToList();
      

      【讨论】:

      • 我没有测试过这两种方法,但你会说你的答案比 bdowden 的更有效吗?
      • 除非你有大量,否则不会有太多内容,但勉强。字符串索引器对每一行的列进行查找。在大多数情况下,坚持使用您认为最简单、最容易理解的方法(仅在需要时进一步优化)。
      • 哦,Cast/Select 中有更多枚举器(=更多开销),但同样:这通常不会产生显着差异。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      相关资源
      最近更新 更多