2012-05-10 27 views
6

我有一個List<MyClass>C#展開平直列表<T>到詞典<T,ICollection的<int>>

public int MyClass 
{ 
    public int One { get; set; } 
    public int Two { get; set; } 
} 

現在,數據可以(不)是這樣的:

一:1,二:9

一:2,二:9

一:如圖1所示,二:8

一:3,二:7

查看如何 「一」 出現兩次?我想突出該平坦序列插入分組Dictionary<int,ICollection<int>>

KeyValuePairOne:{鍵:1,值:{9,8}}

KeyValuePairTwo:{鍵:2,值:{9}}

KeyValuePairThree:{鍵:3,值:{7}}

我猜我需要做的.GroupBy.ToDictionary組合?

+0

你是一個很好的方向。你有什麼嘗試? – SimpleVar

+1

是的,我正在做什麼 –

+0

@Yorye - 我試過了一個醜陋的循環,我知道這不是正確的方式去做,但不知道如何使用'.GroupBy'和''方法。 ToDictionary'在一起,所以我進入堆棧並尋求幫助。 :) – RPM1984

回答

2
var list = new List<MyClass>(); 

var dictionary = list.GroupBy(x => x.One) 
        .ToDictionary(x => x.Key, x => x.ToArray()); 
+0

是正確的,但它實際上是'x => x.Select(y => y.Two).ToArray()'中的'。ToDictionary>',因爲我想結束一個'Dictionary >' – RPM1984

+0

我的不好。但只要你有解決辦法,我很高興。 – SimpleVar

+0

我也是。 :)感謝和接受。 – RPM1984

4

這是什麼ToLookup擴展方法是。 ToDictionary會拋出兩次,如果該鍵出現兩次,ToLookup可以很好地處理它,並執行你正在尋找的東西。

+0

ToLookup與GroupBy非常相似,單靠這個問題不足以解決問題(使字典無法使用) – SimpleVar

+0

@YoryeNathan它比GroupBy更簡潔:一個短語而不是兩個。另外,你的答案就是* - 做一個GroupBy--顯然你認爲它足夠了(或者至少是最好的解決方案)。 – McGarnagle

+0

GroupBy是正確的,但添加了ToDictionary。使用ToDictionary添加ToLookup也可以。順便說一句,它不以任何方式縮短。我要說的是,由於OP想要一本字典,你仍然需要ToDictionary。 – SimpleVar

0

這正是你會怎麼做:

Dictionary<int, List<MyClass>> result = 
    items.GroupBy(x => x.One).ToDictionary(x => x.Key, x => x.ToList()); 
+0

ahhh,就是這樣...(我想)..現在試試... – RPM1984

+2

爲什麼不使用var?另外,.ToArray()也會生成ICollection,並且效率更高。只有在打算使用ICollection上的添加/刪除時,才應該創建一個列表。 – SimpleVar

+0

true和true .. – RPM1984

相關問題