Удалите повторяющиеся строки из DataTable с условием - C# - PullRequest
2 голосов
/ 19 июня 2020

У меня есть таблица данных, как показано ниже

StudentID  Marks 
 AAA        NULL
 AAA        100
 BBB        200

Мне нужно удалить строку из таблицы данных, проверив studentID в условии, что

  1. Если есть тот же идентификатор studentID, удалите строку со значением NULL и отображать только идентификатор студента со значением.
  2. Если обе оценки этого ученика равны NULL, тогда отображается только одна строка.

Результирующая Datatable должна быть

StudentID  Marks 
 AAA        100
 BBB        200

Я попытался удалить повторяющиеся строки из в таблице выше с использованием функции ниже

     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])&& drow["Marks"]==null)
            {
                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;
    }

1 Ответ

0 голосов
/ 19 июня 2020
DataTable datatabble = new DataTable();
datatabble.Columns.Add("studentid", typeof(string));
datatabble.Columns.Add("marks", typeof(int));

datatabble.Rows.Add("AAA");
datatabble.Rows.Add("AAA",100);
datatabble.Rows.Add("BBB",200);

var duplicates = datatabble.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1)
            .Select(dupl => dupl.Key).ToList();

var result = datatabble.AsEnumerable().Where(x => 
        (
           (duplicates.Contains(x[0]) && !string.IsNullOrEmpty(x[1].ToString()))
           || !duplicates.Contains(x[0])
        )           
        ).ToList();

Вывод: вы можете увидеть вывод с 2 строками с отфильтрованным нулевым значением.

enter image description here

...