2010-07-08 6 views
0

У меня 3 столбцов в DataTableКак удалить дубликаты из данных, основанных на значении столбца?

Id Имя графа

1 Джеймс 4345

2 Кристен 89231

3 Джеймс 599

4 Suneel 317113

Мне нужны строки 1 и 3, а новые данные возвращаются только в строки 2 и 4. Я нашел действительно хороший связанный вопрос в предложениях по SO - this guy. Но его решение использует hashtables и устраняет только строку 3, а не 1 и 3. Help!

ответ

0

Хорошо, поэтому я посмотрел на блог, который указал мне Пандия. В разделе комментариев глава Kevin Morris опубликовал решение с использованием словаря 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++; 
     } 
    } 
} 

Если вы идете в 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"); 

дт - DataTable объект

+0

Это не сработало, и я не хотел этого делать изначально. Я хотел внести изменения в данные, не включив никаких дополнительных наборов данных. Но спасибо, что указал мне в правильном направлении. Я посмотрел блог и получил то, что мне нужно :) – Freakishly

0

Как о чем-то вроде этого;

Псевдо код: Предполагая, что объект имеет 3 свойства: [Id, Name, Value] и называются 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