2015-10-20 87 views
2

注意:使用Windows Mobile 6.5 Compact Framework。查找重复项目,然后选择一个与currentDate最近的日期

我收集了以下对象。

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

回答

1

您的表达式对组进行排序,而不是对组进行排序。下面是如何解决此问题:

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

currentDate-fm.Date表达产生的当前日期和RFileModel对象的日期之间的差。具有最小差异的对象将在有序序列的第一位置结束。电话First()从组中挑选出来以产生最终结果。

+0

伟大工程;它返回了完整的列表,并且对于路由6001的重复项,它只包括那个日期最接近今天的那个!谢谢。 – Dayan

1

假设你只想用重复的成员,采取@ 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();