Linq: GroupBy vs Distinct

Я пытаюсь получить запрос Linq для возврата отдельных значений из коллекции. Я нашел два способа сделать это; либо используйте GroupBy или Distinct. Я знаю, что Distinct был сделан для работы, но я должен реализовать IEquatable на объекте.

Я попробовал GroupBy, и это сработало отлично. Я хочу знать, имеет ли использование Distinct vs GroupBy отличное преимущество в производительности.

Ответы

Ответ 1

Distinct() будет сравнивать целые объекты в коллекции (для ссылочных типов вам нужно, чтобы GetHashCode и Equals были переопределены). Он будет перечислять элементы и просто добавлять их в набор. Просто и быстро. Что-то вроде:

Set<TSource> set = new Set<TSource>(comparer);

foreach (TSource tSource in source)
{
     if (!set.Add(tSource))
          continue;

     yield return tSource;
}

GroupBy() позволяет группировать объект с помощью некоторого ключа. В этом случае будут сравниваться ключи. Для каждого элемента в коллекции потребуется выполнить ключевой селектор лямбды. Также ему необходимо создать группировку для каждого отдельного ключа и добавить каждый элемент в коллекции в свою группу:

Func<TSource, TElement> elementSelector = x => x;

<TKey, TElement> lookup = new Lookup<TKey, TElement>(comparer);
foreach (TSource tSource in source)
{
     TKey key = keySelector(tSource);

     // simplified pseudo-code
     if (!lookup.Contains(key))
          lookup.Add(new Grouping(key)); 

     lookup[key].Add(elementSelector(tSource));
}

foreach(IGrouping<TKey, TElement> grouping in lookup)
    yield return grouping;

Итак, я думаю, что GroupBy() не так быстр, как простой Distict().