当数据表是c#中的重复行时,如何从数据表中删除完整行

时间:2016-04-25 06:27:06

标签: c# datatable duplicates

我有一个数据表,其中包含重复行。

|     |                    |            |           |       |
|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避免重复,然后删除所有记录小屋 B2 并且只保留第一个。我想要的只是删除整行(保留一行并删除其他行)。我可以这样做。

6 个答案:

答案 0 :(得分:0)

您可以使用IEnumerable.Distinct

DataTable dataTable = // from data source

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

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

答案 1 :(得分:0)

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

仅更改此行代码

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

答案 2 :(得分:0)

尝试使用DataView并执行此操作

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

在你的情况下把所有列

答案 3 :(得分:0)

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

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

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

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

duplicates.ForEach(dataTable.Rows.Remove);

答案 4 :(得分:0)

非常简单。

您可以尝试以下代码段:

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

答案 5 :(得分:0)

这可能看起来像很多代码,但它使得Distinct方法可以在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);
        }
    }
}