【问题标题】:How to remove complete row from a data table when it is a duplicate row in c#当数据表中的重复行在c#中时如何从数据表中删除完整的行
【发布时间】:2016-08-18 10:05:17
【问题描述】:

我有一个重复行如下的数据表。

|     |                    |            |           |       |
|cid  |    usrnme          |   pname    |   prate   | cabin |
|-----------------------------------------------------------|
|c11  | demo1@gmail.com    |   sample1  |    2000   | B2    | *******
|c14  | demo2@live.com     |   sample2  |    5000   | B3    |
|c15  | demo3@yahoo.com    |   sample3  |    8000   | B2    |
|c11  | demo1@gmail.com    |   sample1  |    2000   | B2    | *******
|c18  | demo4@gmail.com    |   sample4  |    3000   | L1    |
|c11  | demo5@gmail.com    |   sample5  |    7400   | B4    | &&&&&&&
============================================================

注意同一ID有不同的数据,见&&&&&&&

上面重复的两行如何得到一行。我试过This

这是我使用的代码。

public DataTable RemoveduplicateRows(DataTable dTable,string colName)
{
    colName = "cabin";
    Hashtable hTable = new Hashtable();
    ArrayList duplicateArrayList = new ArrayList();


    foreach(DataRow drow in dTable.Rows)
    {
        if (hTable.Contains(drow[colName]))
            duplicateArrayList.Add(drow);
        else
        {
            hTable.Add(drow[colName], string.Empty);
        }
    }

    foreach (DataRow dRow in duplicateArrayList)
        dTable.Rows.Remove(dRow);

    return dTable;
}

如果我使用上面的代码,它会根据cabin 避免重复,然后它会删除其 cabinB2all 记录并保留只有第一个。我想要的是只删除整行(保留一个并删除其他)。我该怎么做。

【问题讨论】:

  • 为什么你从数据库中得到重复的行。对数据库中的重复行进行限制。在查询中使用DISTINCT,GROUP BY 子句

标签: c# datatable duplicates


【解决方案1】:

您可以使用IEnumerable.Distinct

DataTable dataTable = // from data source

var distinctDataTable = dataTable.AsEnumerable().Distinct(DataRowComparer.Default);

另请参阅Comparing DataRows (LINQ to DataSet) 作为参考

【讨论】:

    【解决方案2】:

    是您的cid 决定了记录的唯一性。在提供的示例中,有两行具有相同的cid,整行也相同。这证明如果您使用cid 查找重复项,那么您将获得所需的输出

    只修改这行代码

    colName = "cabin";colName = "cid";

    【讨论】:

    • 我已经编辑了问题。抱歉,cid 可能相同,但其他数据不同。这就是问题
    【解决方案3】:

    尝试使用 DataView 并执行此操作

    DataView view = new DataView(table);
    DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...);
    

    在你的情况下把所有的列

    【讨论】:

      【解决方案4】:

      您的解决方案的问题在于它删除了 所有 个重复项,而不是从每个重复组中保留一行。

      为此,您需要按重复列对行进行分组,并从每组重复项中删除除第一行之外的所有行。

      我没有在 Visual Studio 中对其进行过测试,但下面的代码应该会给你一个正确方向的提示。

      var duplicates = dataTable.Rows
          .Cast<DataRow>()
          .GroupBy(r => r["cabin"])
          .SelectMany(g => g.Skip(1))
          .ToList();
      
      duplicates.ForEach(dataTable.Rows.Remove);
      

      【讨论】:

        【解决方案5】:

        很简单。

        你可以在sn-p下面试试这个:

        DataTable.DefaultView.ToTable(bool distinct, string[] ColumnNames)
        

        【讨论】:

          【解决方案6】:

          这可能看起来像很多代码,但它使 Distinct Method 可以在 DataTable 行上工作。所以你只需要在主代码中的指令。此方法使用标准内置库方法。

          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Text;
          using System.Data;
          namespace ConsoleApplication1
          {
              class Program
              {
                  static void Main(string[] args)
                  {
                      DataTable dt = new DataTable();
                      dt.Columns.Add("cid", typeof(string));
                      dt.Columns.Add("usrnme", typeof(string));
                      dt.Columns.Add("pname", typeof(string));
                      dt.Columns.Add("prate", typeof(int));
                      dt.Columns.Add("cabin", typeof(string));
                      dt.Rows.Add(new object[] { "c11", "demo1@gmail.com", "sample1", 2000, "B2" });
                      dt.Rows.Add(new object[] { "c14", "demo2@live.com", "sample2", 5000, "B3" });
                      dt.Rows.Add(new object[] { "c15", "demo3@yahoo.com", "sample3", 8000, "B2" });
                      dt.Rows.Add(new object[] { "c11", "demo1@gmail.com", "sample1", 2000, "B2" });
                      dt.Rows.Add(new object[] { "c18", "demo4@gmail.com", "sample4", 3000, "L1" });
                      dt.Rows.Add(new object[] { "c11", "demo5@gmail.com", "sample5", 7400, "B4" });
                      dt = dt.AsEnumerable().Select(x => new UniqueColumns(x)).Distinct().Select(y => y.row).CopyToDataTable();
                  }
              }
              public class UniqueColumns : EqualityComparer<UniqueColumns>
              {
                  public DataRow row { get; set; }
                  public UniqueColumns(DataRow row)
                  {
                      this.row = row;
                  }
                  public override int GetHashCode(UniqueColumns _this)
                  {
                      int hash = 0;
                      foreach(var x in _this.row.ItemArray){hash ^= x.GetHashCode();} ;
                      return hash;
                  }
                  public override int GetHashCode()
                  {
                      return this.GetHashCode(this);
                  }
          
                  public override Boolean Equals(UniqueColumns _this, UniqueColumns other)
                  {
                      Boolean results = _this.row.ItemArray.Select((x,i) => x.Equals(other.row.ItemArray[i])).All(y => y);
                      return results;
                  }
                  public override bool Equals(object other)
                  {
                      return this.Equals(this, (UniqueColumns)other);
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2014-05-09
            • 2014-06-19
            • 1970-01-01
            • 2011-09-17
            • 1970-01-01
            • 1970-01-01
            • 2013-04-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多