如何从完全基于列的值DataTable中删除重复?(How do I remove duplicat

2019-10-29 05:41发布

我有3列在一个DataTable

ID名称计数

1个詹姆斯4345

2克里斯汀89231

3詹姆斯599

4 Suneel 317113

我需要行1和3走了,只有新的DataTable返回行2和4。我找到了一个真正的好相关的问题在SO--建议这个家伙 。 但他的解决方案采用哈希表,只有消除了排3,而不是两个1和3的帮助!

Answer 1:

我想这从数据表删除重复 ..

using System.Data;
using System.Linq;
...
//assuming 'ds' is your DataSet
//and that ds has only one DataTable, therefore that table's index is '0'
DataTable dt = ds.Tables[0];
DataView dv = new DataView(dt);
string cols = string.Empty;
foreach (DataColumn col in dt.Columns)
{
if (!string.IsNullOrEmpty(cols)) cols += ",";
cols += col.ColumnName;
}
dt = dv.ToTable(true, cols.Split(','));
ds.Tables.RemoveAt(0);
ds.Tables.Add(dt);

下面的一行代码将避免重复行。

ds.Tables["Employee"].DefaultView.ToTable(true,"Name");

DS - Dataset对象

dt.DefaultView.ToTable( true, "Name");

DT - DataTable对象



Answer 2:

怎么样这样的事情;

伪代码:假设对象有3个属性:ID,NAME,值]和称为NameObjects和是IEnumerable的(列表NameObjects)

var _newNameObjectList = new List<NameObject>();

foreach(var nameObject in NameObjecs)
{
   if(_newNameObjectList.Select(x => x.Name == nameObject.Name).ToList().Count > 0)
   {
      _newNameObjectList.RemoveAll(x => x.Name == nameObject.Name);
      continue;
   }
   else
   {
      _newNameObjectList.Add(nameObject); 
   }
}

这应该工作。 它使用了命名空间System.Linq的;



Answer 3:

好了,所以我看了看博客中指出,以我的Pandiya。 在评论部分,一个叫凯文·莫里斯第一章发布了使用C#字典,它为我工作的解决方案。

在我的主块,我写道:

string keyColumn = "Website";
RemoveDuplicates(table1, keyColumn);

而我RemoveDuplicates功能被定义为:

    private void RemoveDuplicates(DataTable table1, string keyColumn)
{
    Dictionary<string, string> uniquenessDict = new Dictionary<string, string>(table1.Rows.Count);
    StringBuilder sb = null;
    int rowIndex = 0;
    DataRow row;
    DataRowCollection rows = table1.Rows;
    while (rowIndex < rows.Count - 1)
    {
        row = rows[rowIndex];
        sb = new StringBuilder();
            sb.Append(((string)row[keyColumn]));


        if (uniquenessDict.ContainsKey(sb.ToString()))
        {
            rows.Remove(row);
            if (RemoveAllDupes)
            {
                row = rows[rowIndex - 1];
                rows.Remove(row);
            }
        }
        else
        {
            uniquenessDict.Add(sb.ToString(), string.Empty);
            rowIndex++;
        }
    }
}

如果你去的博客 ,你会发现一个更通用的功能,允许在多个列嗅探受骗者。 我添加了一个标志 - RemoveAllDupes - 的情况下,我想删除所有重复行,但仍假定行按名称排序,并只涉及重复,而不是一式三份,一式四份等。 如果任何人都可以,请更新此代码,以反映去除这样的。



文章来源: How do I remove duplicates from a datatable altogether based on a column's value?