首页 > 解决方案 > c#根据条件删除旧的重复数据表

问题描述

我有一个重复行的 DataTable。行相等,但日期不同,并且有些列没有插入日期。我需要删除较旧的重复项并删除未插入日期的重复项。我有以下代码,但它不起作用,因为它无法将字段转换DateTime为进行比较。

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)
   {
    foreach (DataRow drow2 in dTable.Rows)
     {
      if (hTable.Contains(drow[colName]))
       {
        if (DateTime.TryParse(drow["date"].ToString(), out DateTime res))
         {
          if (Convert.ToDateTime(drow["date"])<Convert.ToDateTime(drow2["date"]))
           {
            duplicateList.Add(drow);
           }
           if (Convert.ToDateTime(drow["date"]) > Convert.ToDateTime(drow2["date"]))
           {
           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;
}

标签: c#

解决方案


所以你想根据 - 列删除重复项date?您可以使用 LINQ:

List<DataRow> duplicateRows = dTable.AsEnumerable()
    .GroupBy(r => r[colName])
    .SelectMany(g => g
        .Select(r => new
        {
            Row = r,
            Date = DateTime.TryParse(r.Field<string>("date"), out DateTime date) 
                       ? date : new DateTime?()
        })
        .OrderByDescending(x => x.Date.HasValue)
        .ThenByDescending(x => x.Date.GetValueOrDefault())
        .Skip(1))  // only the first row of the group will be retained
    .Select(x => x.Row)
    .ToList();

duplicateRows.ForEach(dTable.Rows.Remove);

因此,首先包含日期值的所有行,该组按日期值本身降序排列,所以最新的在前,所有其他行都是重复的。


推荐阅读