【问题标题】:Getting duplicates count for each distinct value from a datatable从数据表中获取每个不同值的重复计数
【发布时间】:2010-08-08 10:42:09
【问题描述】:

我有一个数据表,它有一个文本列“标题”,它可以有多个重复值。我可以使用数据视图删除重复项。

DataView v = new DataView(tempTable);
tempTable = v.ToTable(true, "Title");

但是如何在没有任何循环的情况下获得每个不同值的重复数?

【问题讨论】:

    标签: c# .net ado.net duplicates dataview


    【解决方案1】:

    如果您不想循环或使用 Linq,则无法做到这一点,但您可以使用数据表上的计算列和一个条件(如果适用)。也就是说数据应该在这样的两个相关表中。

    DataRelation rel = new DataRelation("CustToOrders", data.Tables["Customers"].Columns["customerid"],    data.Tables["Orders"].Columns["customerid"]);
    data.Relations.Add(rel);
    

    假设 customerid 字段作为 Orders 表中的外键,因此它具有重复项。 您可以通过这种方式获取重复项的数量:

    data.Tables["Customers"].Columns.Add("Duplicates",
       GetType(Decimal), "Count(child.customerid)");
    

    【讨论】:

      【解决方案2】:

      我得到你想要的结果的方式如下所示:

      tempTable.Rows.Cast<DataRow>()
          .Select(dr => Convert.ToString(dr[0]))
          .GroupBy(dr => dr)
          .Select(g => new { Title = g.Key, Count = g.Count() });
      

      但是,它实际上是在引擎盖下循环的。事实上,如果不检查每条记录,我想不出一种方法来进行这种分组。

      缺点是该表达式的结果是一系列匿名类型实例。如果您仍然希望结果是 DataView,您可以重写最后一个 Select 以创建一个包含两列的新 DataRow,并将它们推入一个新的 DataTable 中,然后将其传递给 DataView。

      【讨论】:

      • 您可以将tempTable.Rows.Cast&lt;DataRow&gt;()替换为tempTable.AsEnumerable()
      猜你喜欢
      • 2013-11-16
      • 2014-07-20
      • 2011-10-26
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      相关资源
      最近更新 更多