Порядок устранения при использовании Distinct () на коллекции - PullRequest
3 голосов
/ 11 мая 2010

Если моя коллекция упорядочена по дате, возьмет ли Distinct () первый объект в списке смежных дубликатов или это не точно?Я использую IEqualityComparer, который не учитывает поле даты, но хочу убедиться, что всегда берется самая последняя дата.

Ответы [ 4 ]

5 голосов
/ 11 мая 2010

Вы должны использовать GroupBy:

from s in whatever
group s by new { s.Field1, s.Field2 } into g
select g.OrderByDescending(o => o.Date).First()

EDIT : Вы также можете использовать IEqualityComparer с GroupBy:

whatever.GroupBy(
    s => s,      //Key
    g => g.OrderByDescending(o => o.Date).First()  //Result
    new MyComparer()
);
2 голосов
/ 11 мая 2010

Не определено, что требуется.

На практике это, вероятно, займет первое место, если вы используете LINQ для объектов, но вы не должны на это полагаться.

Если вы обращаетесь к базе данных, это зависит от версии базы данных, плана запросов и т. Д. Тогда вам не следует полагаться на то, что он всегда возвращает первое.

Если вы хотите получить эту гарантию, вы можете использовать DistinctBy с morelinq и попросить Джона Скита гарантировать заказ для вас .

1 голос
/ 11 мая 2010

Enumerable.Distinct не определяет, какое значение возвращается - но я не понимаю, как было бы разумно возвращать что-либо, кроме первого. Аналогично, хотя порядок не определен, имеет смысл возвращать элементы в том порядке, в котором они указаны в исходной последовательности.

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

Если вы хотите положиться на это неуказанное поведение, вам следует упорядочить элементы по дате (по убыванию) перед использованием Distinct. Кроме того, вы можете использовать группировку, а затем упорядочить каждую группу соответствующим образом.

1 голос
/ 11 мая 2010

В комментариях к этому ответу мы с Марком Гравеллом обсуждаем метод Enumerable.Distinct.Вердикт заключается в том, что порядок сохраняется, но документация не гарантирует, что это всегда будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...