2012-02-23 2 views
2

に重複値のグループ化、私は「FOO」の値が一意である、と「バー」の値がある場合、私は、これらのオブジェクトのリストを持っているは、LINQ

class MyObject { 
    public string foo; 
    public string bar; 
} 

の形式で単純なオブジェクトを持っていますない。たとえば -

  • FOO1、BAR1
  • foo2は、BAR2
  • Foo3、BAR1
  • Foo4、BAR3

は、次のような値が、私は最高のグループに探していた想像してみてユニークな 'bar'キーを持つDictionary<string,List<string>と、関連付けられた 'foo'値のList<string>があります。

  • BAR1、[FOO1、Foo3]
  • BAR2、[foo2は]
  • BAR3、[Foo4]

私はかなり単純なループを使用してこれを行うことができます -

Dictionary<string,List<string>> result = new Dictionary<string,List<string>>(); 
myObjectList = new List<MyObject>(); 
foreach (MyObject obj in myObjectList) 
{ 
    if (result.ContainsKey(obj.bar)) 
    { 
     result[obj.bar].Add(obj.foo); 
    } 
    else 
    { 
     result.Add(obj.bar,new List<string> {obj.foo}); 
    } 
} 

しかし、私はLINQを正しく使う方法を学ぼうとしていますし、それを使った洗練されたソリューションがあるようです。 LINQを使ってこれを行う正しい方法は何でしょうか?

答えて

7

それはあなたが本当にただToLookupメソッドを介してLookupをしたいように聞こえる:あなた本当には、あなたのようなものを使用できDictionary必要がある場合は

var lookup = myObjectList.ToLookup(x => x.bar, x => x.foo); 

var dictionary = myObjectList.GroupBy(x => x.bar, x => x.foo) 
          .ToDictionary(g => g.Key, g => g.ToList()); 

を...しかし、あなたができるなら、私は参照を使用したいと思います。

+0

ここで検索がうまくいく理由を説明できますか?ルックアップは固有でないキーを生成しますか?しかし、オペアンプはユニークなキーを求めています... – Umair

+0

申し訳ありません、それを無視してください。私は今あなたの推論を理解しています:) – Umair

+0

@ Umair:ルックアップはまだ複数の要素にマップできるユニークなキーを持っています。 Lookup は辞書に似ていますが、辞書はキーを単一の値にマッピングしますが、Lookup 価値のコレクションに。この場合、ルックアップはすでにキーを値の集合にマップしているため、TValueをいくつかの列挙可能なオブジェクトとして使用する必要はありません。 – Chris