Linq:GroupBy vs Distinct

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

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

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

 Set set = new Set(comparer); foreach (TSource tSource in source) { if (!set.Add(tSource)) continue; yield return tSource; } 

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

 Func elementSelector = x => x;  lookup = new Lookup(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 grouping in lookup) yield return grouping; 

所以,我认为GroupBy()并不像简单的Distict()那么快。