「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> { ...
」に置き換えることができると仮定しましたが、それは機能しませんでした(キーと値は読み取り専用としてマークされていたため、このコードをコンパイルできませんでした。
これは可能ですか、または複数のステップでこれを行う必要がありますか?
ありがとう。
拡張メソッドは 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」が含まれます
var dictionary = (from x in y
select new SomeClass
{
prop1 = value1,
prop2 = value2
}
).ToDictionary(item => item.prop1);
それは、SomeClass.prop1
が辞書に望ましいKey
であると仮定しています。
KeyValuePair
のコレクションはさらに明示的であり、非常に適切に実行されます。
Dictionary<int, string> dictionary = objects
.Select(x=> new KeyValuePair<int, string>(x.Id, x.Name))
.ToDictionary(x=>x.Key, x=>x.Value);