Примечание. Используется 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, чтобы я мог перебирать каждый неуникальный идентификатор и сравнивать даты, чтобы увидеть, какой из них сохранить.

Как я могу добиться этого с помощью LINQ или просто старого кода foreach?

2
Dayan 20 Окт 2015 в 22:44

2 ответа

Лучший ответ

Ваше выражение сортирует группы, а не элементы групп. Вот как это исправить:

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

Выражение currentDate-fm.Date определяет разницу между текущей датой и датой объекта RFileModel. Объект с наименьшей разницей окажется в первой позиции упорядоченной последовательности. Вызов First() забирает его из группы для получения окончательного результата.

1
Sergey Kalinichenko 20 Окт 2015 в 19:52

Предполагая, что вам нужны ТОЛЬКО члены с дубликатами, возьмите ответ @ 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();
1
Michael Blackburn 20 Окт 2015 в 20:05