Linq:GroupBy vs Distinct

时间:2014-02-27 10:54:42

标签: c# linq

我一直在尝试获取Linq查询以从集合中返回不同的值。我发现了两种方法;使用GroupBy或Distinct。 我知道Distinct是为这个工作做的,但我必须在对象上实现IEquatable。

我尝试了GroupBy,这很好用。我想知道使用Distinct vs GroupBy是否具有明显的性能优势。

1 个答案:

答案 0 :(得分:17)

Distinct()将比较集合中的整个对象(对于需要覆盖GetHashCode和Equals的引用类型)。它将枚举项目并将它们添加到集合中。简单快捷。类似的东西:

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

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

     yield return tSource;
}

GroupBy()允许您通过某个键对对象进行分组。在这种情况下,将比较密钥。它需要为集合中的每个项执行键选择器lambda。此外,它还需要为每个不同的密钥创建分组,并将集合中的每个项目添加到其组中:

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()