web-dev-qa-db-ja.com

LINQを使用して辞書<T1、T2>を選択します

「select」キーワードと拡張メソッドを使用してLINQでIEnumerable<T>を返しましたが、汎用Dictionary<T1, T2>を返す必要があり、それを把握できません。私がこれを学んだ例では、次のような形式の何かを使用しました。

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> { ...」に置き換えることができると仮定しましたが、それは機能しませんでした(キーと値は読み取り専用としてマークされていたため、このコードをコンパイルできませんでした。

これは可能ですか、または複数のステップでこれを行う必要がありますか?

ありがとう。

156
Rich

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

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]には値「Hello」が含まれます

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

それは、SomeClass.prop1が辞書に望ましいKeyであると仮定しています。

42
albertein

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

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