2015-10-20 34 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();