我有3列的DataTable如何基於列的值從完全刪除數據表中的重複項?
ID名稱計數
1個詹姆斯4345
2克里斯汀89231個
3個詹姆斯599
4 Suneel 317113
我需要第1行和第3行消失,而新的數據表只返回第2和第4行。我在SO-- this guy的建議中發現了一個非常好的相關問題。但他的解決方案使用哈希表,並且僅消除第3行,而不是第1行和第3行。
我有3列的DataTable如何基於列的值從完全刪除數據表中的重複項?
ID名稱計數
1個詹姆斯4345
2克里斯汀89231個
3個詹姆斯599
4 Suneel 317113
我需要第1行和第3行消失,而新的數據表只返回第2和第4行。我在SO-- this guy的建議中發現了一個非常好的相關問題。但他的解決方案使用哈希表,並且僅消除第3行,而不是第1行和第3行。
好吧,所以我看了潘迪亞指出的博客。在評論部分,一位名叫凱文·莫里斯的人使用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 - 以防我想刪除所有重複的行,但是這仍然假定這些行按名稱排序,並且只涉及重複項而不是三重複,一式四份等等。如果有人可以,請更新此代碼以反映刪除此類內容。
我想這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對象
如何這樣的事情;
僞代碼: 假設對象有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;
對不起,我不想使用LINQ,只是純粹的C#。 – Freakishly 2010-07-08 17:27:44
這不起作用,並不是我原本想做的。我想更改數據表而不涉及更多的數據集。但是,謝謝你指出我正確的方向。我看了一下博客,得到了我需要的:) – Freakishly 2010-07-08 17:27:12