查找重复项,然后选择日期最接近currentDate的项

本文关键字:日期 最接近 currentDate 的项 选择 然后 查找 | 更新日期: 2023-09-27 18:18:44

注意:使用Windows Mobile 6.5 Compact Framework

我有一个下列对象的集合:

public class RFileModel
{
    public List<string> RequiredFilesForR = new List<string>();
    public string Date { get; set; }
    public string RouteId { get; set; }
}
var ListOfRFileModels = new List<RFileModel>();

相同的RouteId有可能出现在RFileModel的多个实例中,但Date不同。

我正在尝试识别重复项并只选择一个,最接近当前日期的一个。

到目前为止,我有以下LINQ:
var query =  ListOfRFileModels.GroupBy(route => route.RouteId)
                              .OrderBy(newGroup => newGroup.Key)
                              .Select(newGroup => newGroup).ToList();

但是我不认为这是我需要的,因为它仍然返回所有元素。我期待一个非唯一RouteId的列表,这样我就可以迭代每个非唯一id并比较日期以查看要保留哪个。

如何使用LINQ或简单的foreach来完成此操作?

查找重复项,然后选择日期最接近currentDate的项

您的表达式排序的是组,而不是组元素。下面是修复方法:

DateTime currentDate = ...
var query =  ListOfRFileModels
    .GroupBy(route => route.RouteId)
    .Select(g => g.OrderBy(fm => currentDate-fm.Date).First())
    .ToList();

currentDate-fm.Date表达式产生当前日期与RFileModel对象的日期之差。差异最小的对象最终将位于有序序列的第一个位置。呼叫First()从组中拾取它以产生最终结果。

假设您只想要重复的成员,取@dasblinkenlight的答案并添加Where子句:.Where(grp => grp.Count()>1):

DateTime currentDate = DateTime.Now;
var query =  ListOfRFileModels
   .GroupBy(route => route.RouteId)
   .Where(grp => grp.Count()>1)
   .Select(g => g.OrderBy(fm => currentDate-fm.Date).First())
   .ToList();