使用Linq根据第二列按列值删除重复项

时间:2016-01-07 17:07:36

标签: c# linq

我有一个带有两列“DT”和“ASOF”的数据表,两个日期。有些行有重复的DT值,我可以这样做:

      var duplicateGroups = dt.AsEnumerable()
                                  .GroupBy(row => row.Field<SqlDateTime>("DT"))
                                  .Where(g => g.Count() > 1);

但是还有另一个专栏“ASOF”,我想根据“ASOF”值去除其中一个重复的DT,基本上ASOF日期是最新的。

我可以想到一个for循环,它可以通过创建重复数组,找到最新的ASOF,然后使用该值从数据库表中删除所有其他数据来完成此操作。但是,我觉得Linq有能力做到这一点,可能还有比较器。但我对它有一些非常基本的知识。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

除非您确实需要修改原始DataTable,否则您只需创建一个投影,即可在每个DT组中为您提供具有“最新”的记录ASOF值:

  var rows = dt.AsEnumerable()
               .OrderBy(row => row.Field<SqlDateTime>("ASOF"))
               .GroupBy(row => row.Field<SqlDateTime>("DT"))
               .Select(rg => rg.First())
               .ToList();

然后清除原始数据表并将其替换为这些行,或者根据这些行创建新的DataTable并将其与原始行交换。

另一种选择是在加载到数据表之前过滤数据,但由于你没有说明这是怎么回事,我不能在那里提供任何指导。