Как мне полностью удалить дубликаты из таблицы данных на основе значения столбца? - PullRequest
0 голосов
/ 08 июля 2010

У меня есть 3 столбца в DataTable

Id Name Count

1 Джеймс 4345

2 Кристен 89231

3 Джеймс 599

4 Suneel 317113

Мне нужно пропустить строки 1 и 3, а новый набор данных, возвращающий только строки 2 и 4. В предложениях по SO - этот парень нашел действительно хороший связанный вопрос Но его решение использует хеш-таблицы и исключает только строку 3, а не 1 и 3. Справка!

Ответы [ 3 ]

0 голосов
/ 08 июля 2010

Примерно так:

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

Хорошо, я посмотрел на блог, указанный мне Пандией.В разделе комментариев парень по имени Кевин Моррис опубликовал решение, используя словарь 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 - на случай, если я хочу удалить все дублирующиеся строки, но это все еще предполагает, что строки упорядочены по имени, и включает только дубликаты, а не тройные, четырехкратные и так далее.Если кто-то может, обновите этот код, чтобы отразить его удаление.

0 голосов
/ 08 июля 2010

Я попробовал это Удалить дубликаты из таблицы данных ..

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);

Следующая строка кода позволит избежать дублирования строк.Объект набора данных

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

dt - объект DataTable

...