2010-07-08 47 views
0

我有3列的DataTable如何基於列的值從完全刪除數據表中的重複項?

ID名稱計數

1個詹姆斯4345

2克里斯汀89231個

3個詹姆斯599

4 Suneel 317113

我需要第1行和第3行消失,而新的數據表只返回第2和第4行。我在SO-- this guy的建議中發現了一個非常好的相關問題。但他的解決方案使用哈希表,並且僅消除第3行,而不是第1行和第3行。

回答

0

好吧,所以我看了潘迪亞指出的博客。在評論部分,一位名叫凱文·莫里斯的人使用C#Dictionary發佈了一個解決方案,該解決方案適用於我。

在我的主塊,我寫道:

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++; 
     } 
    } 
} 

如果你去the blog,你會發現一個更通用的功能,可以讓嗅探在多列的模糊。我添加了一個標誌 - RemoveAllDupes - 以防我想刪除所有重複的行,但是這仍然假定這些行按名稱排序,並且只涉及重複項而不是三重複,一式四份等等。如果有人可以,請更新此代碼以反映刪除此類內容。

0

我想這Remove duplicates from a datatable ..

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對象

+0

這不起作用,並不是我原本想做的。我想更改數據表而不涉及更多的數據集。但是,謝謝你指出我正確的方向。我看了一下博客,得到了我需要的:) – Freakishly 2010-07-08 17:27:12

0

如何這樣的事情;

僞代碼: 假設對象有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;

+0

對不起,我不想使用LINQ,只是純粹的C#。 – Freakishly 2010-07-08 17:27:44