Удаление повторяющихся значений столбца из таблицы данных без использования LINQ

Рассмотрим мой datatable,

Id  Name  MobNo
1   ac    9566643707
2   bc    9944556612
3   cc    9566643707

Как удалить строку 3, которая содержит повторяющееся значение столбца MobNo в С# без использования LINQ. Я видел подобные вопросы на SO, но все ответы используют LINQ.


person ACP    schedule 24.05.2010    source источник
comment
Когда обнаружены дубликаты, как вы хотите решить, какие из них оставить, а какие удалить?   -  person Tomas Aschan    schedule 24.05.2010
comment
@Томас всегда остается первым...   -  person ACP    schedule 24.05.2010
comment
Вы хотите просто получить набор записей с уникальными мобильными номерами или удалить записи с дубликатами из существующего набора?   -  person Strelok    schedule 24.05.2010
comment
@strelokstrelok я хочу последний...   -  person ACP    schedule 24.05.2010


Ответы (5)


Следующий метод сделал то, что я хочу....

public DataTable RemoveDuplicateRows(DataTable dTable, string colName)
    {
        Hashtable hTable = new Hashtable();
        ArrayList duplicateList = new ArrayList();

        //Add list of all the unique item value to hashtable, which stores combination of key, value pair.
        //And add duplicate item value in arraylist.
        foreach (DataRow drow in dTable.Rows)
        {
            if (hTable.Contains(drow[colName]))
                duplicateList.Add(drow);
            else
                hTable.Add(drow[colName], string.Empty);
        }

        //Removing a list of duplicate items from datatable.
        foreach (DataRow dRow in duplicateList)
            dTable.Rows.Remove(dRow);

        //Datatable which contains unique records will be return as output.
        return dTable;
    }
person ACP    schedule 24.05.2010

Пока вы читаете файл CSV (немного псевдокода, но вы поняли):

List<String> uniqueMobiles = new List<String>();

String[] fileLines = readYourFile();

for (String line in fileLines) {
   DataRow row = parseLine(line);
   if (uniqueMobiles.Contains(row["MobNum"])
   {
       continue;
   }
   uniqueMobiles.Add(row["MobNum"]);
   yourDataTable.Rows.Add(row);       
}

Это загрузит в вашу таблицу данных только записи с уникальными мобильными телефонами.

person Strelok    schedule 24.05.2010

Это самый простой способ.

**

var uniqueContacts = dt.AsEnumerable()
                       .GroupBy(x=>x.Field<string>("Email"))
                       .Select(g=>g.First());

** Я нашел это в этой теме -a-specific">LINQ для удаления повторяющихся строк из таблицы данных на основе значения определенной строки

что на самом деле было для меня, что я возвращаю его как datatable

DataTable uniqueContacts = dt.AsEnumerable()
                           .GroupBy(x=>x.Field<string>("Email"))
                           .Select(g=>g.First()).CopyToDataTable();
person Ahmed Samir    schedule 18.03.2015

Возможно, вы захотите посмотреть внутреннюю работу DISTINCT, прежде чем запускать это в своей резкой БД (обязательно сделайте резервную копию!), Но если это работает так, как я думаю (захват первого значения), вы сможете использовать (что-то очень похоже на) следующий SQL:

DELETE FROM YourTable WHERE Id NOT IN (SELECT DISTINCT Id, MobNo FROM YourTable);
person Tomas Aschan    schedule 24.05.2010
comment
@Пандия, ну почему ты не сказал? знак равно - person Tomas Aschan; 24.05.2010

Вы можете использовать "IEqualityComparer" в С#

person renjucool    schedule 24.05.2010