LINQ-リストを値としてリストから辞書に変換


99

私は持っています

List<MyObject> 

データベースから取得します。ただし、グループ化の目的で、MyObjectのプロパティにキーを設定したいと思います。LINQでリストをキャストする最良の方法は何ですか。

Dictionary<long, List<MyObject>>

私は以下を持っています:

myObjectList.ToDictionary(x => x.KeyedProperty)

しかし、それは戻ります:

Dictionary<long, MyObject>

WHOCH MyObjectのプロパティをキーにした辞書が必要ですか?-あなたはそれらの完全なリストを持っています...
James Curran

回答:


191

MyObjectインスタンスKeyedPropertyをグループ化し、そのグループ化をにしたいようですDictionary<long,List<MyObject>>。もしそうなら、以下を試してください

List<MyObject> list = ...;
var map = list
  .GroupBy(x => x.KeyedProperty)
  .ToDictionary(x => x.Key, x => x.ToList());

16

次のように、クラスでToLookup拡張メソッドを使用する必要があります。Enumerable

List<MyObject> list = ...;

ILookup<long, MyObject> lookup = list.ToLookup(o => o.KeyedProperty);

辞書に配置したい場合は、次のようにToDictionary拡張メソッドを使用できます。

IDictionary<long, IEnumerable<MyObject>> dictionary = lookup.ToDictionary(
    l => l.Key);

これと受け入れられた答えの違いは何ですか?んILookup受け入れ答えがないのに対し、参照を保存しますか?
PatPeter、

@PatPeterアイデアは、キーとアイテムの間に1対多の関係があるLookup<TKey, TValue>場合、a はaよりも優れた構造になる可能性があるということDictionary<TKey, TValue>です。
casperOne

1
@PatPeter私はILookupが使用するのに優れた構造(C ++コレクションアルゴリズムを知っている場合は、マルチマップからディクショナリーのマップのようなもの)だと思いますが、覚えておくべき大きな要素が1つあります-作成されたルックアップは不変です。後からエントリを追加または削除することはできません。
gbjbaanb

他の考慮事項は、ILookup多くの場合、理想的なコード内構造ですが、シリアル化ではうまく処理されないことが多いということです。
ジェフB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.