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

问题描述 投票:0回答:6

我有一个数据表,其中有重复行,如下所示。

|     |                    |            |           |       |
|cid  |    usrnme          |   pname    |   prate   | cabin |
|-----------------------------------------------------------|
|c11  | [email protected]    |   sample1  |    2000   | B2    | *******
|c14  | [email protected]     |   sample2  |    5000   | B3    |
|c15  | [email protected]    |   sample3  |    8000   | B2    |
|c11  | [email protected]    |   sample1  |    2000   | B2    | *******
|c18  | [email protected]    |   sample4  |    3000   | L1    |
|c11  | [email protected]    |   sample5  |    7400   | B4    | &&&&&&&
============================================================

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

如何为上面重复的两行获取一行。我已经尝试过这个

这是我使用的代码。

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
避免重复,然后删除其cabinB2的所有记录并仅保留第一个。我想要的是仅删除整行(保留一个)并删除其他)。我该怎么做。

c# datatable duplicates
6个回答
0
投票
决定记录的唯一性的是你的

cid

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

仅更改这行代码

colName = "cabin";

colName = "cid";

    


0
投票
尝试使用 DataView 并执行此操作

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

在你的情况下放置所有列


0
投票
您可以使用

IEnumerable.Distinct

DataTable dataTable = // from data source var distinctDataTable = dataTable.AsEnumerable().Distinct(DataRowComparer.Default);

另请参阅

比较 DataRows (LINQ to DataSet) 作为参考


0
投票
您的解决方案的问题在于它删除了

all重复项,而不是从每个重复组中保留一行。

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

我还没有在 Visual Studio 中测试过它,但下面的代码应该会给你正确方向的提示。

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

0
投票
这可能看起来有很多代码,但它使 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", "[email protected]", "sample1", 2000, "B2" }); dt.Rows.Add(new object[] { "c14", "[email protected]", "sample2", 5000, "B3" }); dt.Rows.Add(new object[] { "c15", "[email protected]", "sample3", 8000, "B2" }); dt.Rows.Add(new object[] { "c11", "[email protected]", "sample1", 2000, "B2" }); dt.Rows.Add(new object[] { "c18", "[email protected]", "sample4", 3000, "L1" }); dt.Rows.Add(new object[] { "c11", "[email protected]", "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); } } }
    

0
投票
非常简单。

您可以尝试以下代码片段:

DataTable.DefaultView.ToTable(bool distinct, string[] ColumnNames)
    
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.