我一直在尝试获取Linq查询以从集合中返回不同的值。我发现了两种方法;使用GroupBy或Distinct。 我知道Distinct是为这个工作做的,但我必须在对象上实现IEquatable。
我尝试了GroupBy,这很好用。我想知道使用Distinct vs GroupBy是否具有明显的性能优势。
答案 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()
。