LINQ To Objects的GroupBy方法是如何工作的?它是否会为每个键遍历整个集合?有没有办法告诉GroupBy方法集合已经排序?
如果合理使用,GroupBy 可以在单向遍历中完成。一个基本的实现(非它们的实现)可能会类似于:
var data = new Dictionary<TKey, List<TValue>>(comparer);
foreach(var item in source) {
var key = keySelector(item);
List<TValue> list;
if(!data.TryGetValue(key, out list))
{
data.Add(key, list = new List<TValue>());
}
list.Add(itemSelector(item));
}
这基本上是按键分组,为每个唯一的键创建一个列表,其中包含值。
你可以做一些比较最后看到的键的事情(以帮助排序数据),但是……你需要进行性能分析才能知道是否值得。
让我们来看看重载(overload)
IEnumerable<IGrouping<TKey, TSource>> Enumerable.GroupBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector
);
var dictionary = new Dictionary<TKey, List<TSource>> dictionary;
foreach(var element in source) {
key = keySelector(element);
List<TSource> list;
if(!dictionary.TryGetValue(key, out list)) {
list = new List<TSource>();
dictionary.Add(key, list);
}
list.Add(element);
}
从这里,您可以轻松地生成一系列IGrouping<TKey, TSource>
。
我不明白您为什么认为列表的排序很重要。
yield return
它,然后开始一个新的IGrouping。@Idsa-制作一个GroupBySorted
扩展方法并对其进行分析以查看它是否比常规的GroupBy
有任何实际好处不会太难。 - Joel Mueller