LINQ To Objects GroupBy方法是如何工作的?它是否看起來每個關鍵的整個集合?有什麼方法可以對GroupBy方法說明集合已排序?LINQ To Objects GroupBy方法
9
A
回答
2
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));
}
,基本上組,爲每個唯一的密鑰生成一個列表,包含值。
你可能做比較最後看到的鍵(幫助排序的數據),但...你需要知道它是否值得。
2
就讓我們看看超載
IEnumerable<IGrouping<TKey, TSource>> Enumerable.GroupBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector
);
作爲其最簡單的理解。有效的代碼會做這樣的事情:
枚舉通過source
對於源中的每個element
,地圖元素key = keySelector(element)
看看key
是由TKey
鍵控字典,如果它不是,添加key
,其中值爲a List<TSource>
和第一項element
否則,獲取與密鑰關聯的List<TSource>
並將element
添加到列表
現在你有了一個字典映射TKey
- >TSource
並且可以很容易地產生一個序列IGrouping<TKey, TElement>
。
因此,像
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>
序列。
我不明白你爲什麼認爲列表正在排序很重要。
0
它看起來每個關鍵的整個集合?
號的GroupBy的實施,爲O(n),而不是爲O(n^2)
相關問題
- 1. LinQ to objects GroupBy()by object and Sum()by amount
- 2. LINQ to XML GroupBy
- 3. Linq to Entities - GroupBy
- 4. c#Linq to Objects - FirstOrDefault performance
- 5. LINQ to Objects - 綁定到ListView
- 6. LINQ to Objects - 不包含?
- 7. Linq To Objects外部連接
- 8. Xamarin LINQ to Objects支持
- 9. LINQ to Objects - NOT IN查詢
- 10. Dynamic GroupBy Linq to SQL
- 11. LINQ to Entities和LINQ to Objects如何處理轉換差異
- 12. LINQ to Entities GroupBy,OrderByDescending,FirstOrDefault
- 13. Linq to Objects加到列表中
- 14. Linq to objects - 選擇第一個對象
- 15. linq to entities vs linq to objects - 它們是一樣的嗎?
- 16. 在Linq-to-Objects和Linq-to-XML中設置語義的問題
- 17. if..if else..else..in linq to objects
- 18. Linq to objects謂詞生成器
- 19. Quaere - 任何人使用它? (LINQ to Objects)
- 20. 集合被修改異常linq-to-objects
- 21. NoSQL vs Linq To Objects for asp.net mvc
- 22. 何時不使用LINQ To Objects?
- 23. LINQ to Objects和排序順序
- 24. 對Linq-to-Entities查詢操作的Linq-to-Objects查詢存在一些混淆
- 25. 在C#(Linq to Objects)中是否存在std :: for_each算法模擬
- 26. C#的LINQ GROUPBY方法的語法
- 27. 使用Linq To Objects執行分組/投影的最簡單方法
- 28. 如何使用groupBy與F#linq-to-sql?
- 29. GroupBy然後接納LINQ to Entities?
- 30. Linq to SQL GroupBy幾個字段
如果列表進行排序,我們可以得到IGrouping不處理整個列表 – SiberianGuy 2011-05-20 19:58:01
@Idsa:解釋。 – jason 2011-05-20 20:32:12
如果列表按鍵排序,並且您知道它,則可以創建一個IGrouping對象,然後在鍵值更改後立即「返回」,然後開始新的IGrouping。 @Idsa - 製作「GroupBySorted」擴展方法並不難,然後對其進行配置以查看它是否比常規的GroupBy具有任何實際優勢... – 2011-05-20 21:33:31