我有一个数据表,其中有重复行,如下所示。
| | | | | |
|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
避免重复,然后删除其cabin为B2的所有记录并仅保留第一个。我想要的是仅删除整行(保留一个)并删除其他)。我该怎么做。
cid
。在提供的示例中,有两行具有相同的
cid
并且整行也相同。这证明,如果您使用
cid
查找重复项,那么您将获得所需的输出仅更改这行代码
colName = "cabin";
至
colName = "cid";
DataView view = new DataView(table);
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...);
在你的情况下放置所有列
DataTable dataTable = // from data source
var distinctDataTable = dataTable.AsEnumerable().Distinct(DataRowComparer.Default);
另请参阅
比较 DataRows (LINQ to DataSet) 作为参考
all重复项,而不是从每个重复组中保留一行。
为此,您需要按重复列对行进行分组,并从每组重复项中删除除第一行之外的所有行。我还没有在 Visual Studio 中测试过它,但下面的代码应该会给你正确方向的提示。
var duplicates = dataTable.Rows
.Cast<DataRow>()
.GroupBy(r => r["cabin"])
.SelectMany(g => g.Skip(1))
.ToList();
duplicates.ForEach(dataTable.Rows.Remove);
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);
}
}
}
您可以尝试以下代码片段:
DataTable.DefaultView.ToTable(bool distinct, string[] ColumnNames)