LINQ

2009-03-06 6 views
138

と辞書を選択 私はLINQで IEnumerable<T>を返すために "select"キーワードと拡張メソッドを使用しましたが、一般的な Dictionary<T1, T2>を返す必要があり、それを理解することはできません。私はこれを次のような形で使用しています: LINQ

IEnumerable<T> coll = from x in y 
    select new SomeClass{ prop1 = value1, prop2 = value2 }; 

私はまた、拡張メソッドで同じことをしました。 Dictionary<T1, T2>のアイテムはKeyValuePair<T1, T2>として反復することができますが、上記の例では "SomeClass"を "new KeyValuePair<T1, T2> { ..."に置き換えることができますが、それは機能しませんでした(KeyとValueは読み取り専用としてマークされていますこのコードをコンパイルしてください)。

これが可能ですか、これを複数の手順で行う必要がありますか?

ありがとうございました。

答えて

221

拡張メソッドはまた、ToDictionary拡張を提供します。使用方法はかなり簡単ですが、一般的な使い方ではキーのラムダセレクタを渡してオブジェクトを値として取得しますが、キーと値の両方にラムダセレクタを渡すことができます。 SomeClass.prop1辞書のために必要なKeyであると仮定しています

class SomeObject 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

SomeObject[] objects = new SomeObject[] 
{ 
    new SomeObject { ID = 1, Name = "Hello" }, 
    new SomeObject { ID = 2, Name = "World" } 
}; 

Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name); 

その後objectDictionary[1]は "こんにちは" の値が含まれます

+3

+1 Whuh。これは、私が新しいデータオブジェクトを作成する方法に新しい可能性を広げます。 – Sung

+1

すごく、あなたはそれを使い果たしてうれしいです、私はそれがいくつかの状況で私を助けてくれたことを知っています。 –

+2

Egads!それは今2017年だし、私はちょうどこれについて知っている! –

34
var dictionary = (from x in y 
        select new SomeClass 
        { 
         prop1 = value1, 
         prop2 = value2 
        } 
       ).ToDictionary(item => item.prop1); 

+21

'.ToDictionary(item => item.prop1、item => item.prop2);'明示的に値を設定します。 – finoutlook

11

KeyValuePairのコレクションはさらに明示的であり、非常にうまく実行されます。

Dictionary<int, string> dictionary = objects 
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name)) 
    .ToDictionary(x=>x.Key, x=>x.Value);