我有一个数据表,其中包含重复行。
| | | | | |
|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 并且只保留第一个。我想要的只是删除整行(保留一行并删除其他行)。我可以这样做。
答案 0 :(得分:0)
您可以使用IEnumerable.Distinct
DataTable dataTable = // from data source
var distinctDataTable = dataTable.AsEnumerable().Distinct(DataRowComparer.Default);
答案 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);
}
}
}