Dayan
Dayan

Reputation: 8031

Finding duplicate items then selecting one with closest date to currentDate

Note: Using Windows Mobile 6.5 Compact Framework.

I have a collection of the following object.

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>();

There is the chance that the same RouteId will be in multiple instances of RFileModel but with a different Date.

I'm trying to identify the duplicates and select only one, the one closest to the current date.

I have the following LINQ so far:

var query =  ListOfRFileModels.GroupBy(route => route.RouteId)
                              .OrderBy(newGroup => newGroup.Key)
                              .Select(newGroup => newGroup).ToList();

But I don't think this is what I need, since it still returns all elements. I was expecting a list of non unique RouteId, that way I can iterate each non-unique id and compare dates to see which one to keep.

How can I accomplish this with LINQ or just plain ole foreach?

Upvotes: 2

Views: 107

Answers (2)

Michael Blackburn
Michael Blackburn

Reputation: 3229

Assuming you want ONLY the members with duplicates, take @dasblinkenlight's answer and add a Where clause: .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();

Upvotes: 1

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726929

Your expression sorts groups, not group elements. Here is how to fix it:

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

currentDate-fm.Date expression produces the difference between the current date and the date of the RFileModel object. The object with the smallest difference would end up in the first position of the ordered sequence. The call First() picks it up from the group to produce the final result.

Upvotes: 1

Related Questions