LINQでディクショナリ<T1、T2>を選択します


171

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

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

拡張メソッドでも同じことを行いました。上記の例の "SomeClass"を ""で置き換えるDictionary<T1, T2>ことができるようにaの項目を 反復できるため、それは機能しませんでした(キーと値が読み取り専用としてマークされていたため、このコードをコンパイルできませんでした) )。KeyValuePair<T1, T2>new KeyValuePair<T1, T2> { ...

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

ありがとう。

回答:


284

拡張メソッドは、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」が含まれます


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

それは辞書にとってSomeClass.prop1望ましいことだと想定していますKey


27
.ToDictionary(item => item.prop1, item => item.prop2);明示的に値も設定します。
finoutlook 2011

42

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

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

.ToDictionary(x => x.Key、x => x.Value);を削除することは可能ですか?新しいKeyValuePairを新しいディクショナリに置き換えますか?
Hajihaアミール18年

@ AmirNo-Family間違えています。Select(x => x ...)メソッドは、オブジェクトコレクションの各要素に対して投影を実行します。したがって、新しいKeyValuePairを新しい辞書に置き換えると、辞書の辞書が作成されます。それはあなたが目指していることではないと思います。
Antoine Meltzheim

Dictionary <string、string>のリストがあり、selectを使用しようとしましたが、コンパイルエラーがスローされます。
アミールハジハ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.