Ответ 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()
.