C # Удалить «частичные» дубликаты из коллекции массивов - PullRequest
4 голосов
/ 03 ноября 2011

Я пытался найти ответ на мою проблему, но я застрял.У меня есть коллекция массивов, и мне нужно удалить записи, в которых некоторые атрибуты совпадают.

Пример: у меня есть атрибуты - BeginTime, EndTime, Date, Price.

07:00, 11:00, 2011-11-14, 90
08:00, 12:00, 2011-11-14, 110
07:00, 11:00, 2011-11-15, 120
07:00, 11:00, 2011-11-14, 50

И я хочу удалитьзаписи, в которых BeginTime, EndTime и Date совпадают, а цена не самая низкая.В этом примере удаленная запись будет первой.

Спасибо за любую помощь или предложение

1 Ответ

6 голосов
/ 03 ноября 2011

Как насчет LINQ:

IEnumerable<Bar> bars = ...

var lowestPriceBars = bars.GroupBy(bar => new { bar.BeginTime, bar.EndTime, bar.Date } )
                          .Select(g => g.OrderBy(bar => bar.Price).First())
                          .ToArray();

Это работает, группируя элементы с одинаковыми временными метками вместе, а затем производя из каждой группы элемент с наименьшей ценой.Обратите внимание, что если в группе есть несколько элементов с одинаковой наименьшей ценой, запрос сохранит один из них произвольно.

Также обратите внимание, что с оператором MinBy (например, один из нескольких morelinq ), вы можете сделать операцию Select более эффективной с помощью:

.Select(g => g.MinBy(bar => bar.Price))

EDIT : если вы хотите сохранить все элементы ссамая низкая цена, которую вы можете сделать:

var lowestPriceBars = bars.GroupBy(bar => new { bar.BeginTime, bar.EndTime, bar.Date })
                          .SelectMany(timeGroup => timeGroup
                                                   .GroupBy(bar => bar.Price)
                                                   .OrderBy(priceGroup => priceGroup.Key)
                                                   .First())
                          .ToArray();
...