Pilih Kamus <T1, T2> dengan LINQ

171

Saya telah menggunakan kata kunci "pilih" dan metode ekstensi untuk mengembalikan IEnumerable<T>dengan LINQ, tetapi saya harus mengembalikan generik Dictionary<T1, T2>dan tidak dapat menemukannya. Contoh saya belajar ini dari menggunakan sesuatu dalam bentuk yang mirip dengan yang berikut:

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

Saya juga telah melakukan hal yang sama dengan metode ekstensi. Saya berasumsi bahwa karena item dalam a Dictionary<T1, T2>dapat diulang karena KeyValuePair<T1, T2>saya hanya bisa mengganti "SomeClass" dalam contoh di atas dengan " new KeyValuePair<T1, T2> { ...", tetapi itu tidak berhasil (Kunci dan Nilai ditandai sebagai hanya dapat dibaca, jadi saya tidak dapat mengkompilasi kode ini ).

Apakah ini mungkin, atau apakah saya perlu melakukan ini dalam beberapa langkah?

Terima kasih.

Kaya
sumber

Jawaban:

284

Metode ekstensi juga menyediakan ekstensi ToDictionary . Ini cukup sederhana untuk digunakan, penggunaan umum melewati pemilih lambda untuk kunci dan mendapatkan objek sebagai nilai, tetapi Anda bisa melewati pemilih lambda untuk kunci dan nilai.

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);

Maka objectDictionary[1]akan berisi nilai "Halo"

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

Itu dengan asumsi itu SomeClass.prop1yang diinginkan Keyuntuk kamus.

albertein
sumber
27
.ToDictionary(item => item.prop1, item => item.prop2);untuk explicity mengatur nilainya juga.
finoutlook
42

Kumpulan KeyValuePairbahkan lebih eksplisit, dan dijalankan dengan sangat baik.

Dictionary<int, string> dictionary = objects
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name))
    .ToDictionary(x=>x.Key, x=>x.Value);
Antoine Meltzheim
sumber
Apakah mungkin untuk menghapus .ToDictionary (x => x.Key, x => x.Value); dan ganti KeyValuePair baru dengan Kamus baru?
Amir Hajiha
@ AmirNo-Keluarga Anda salah. Pilih (x => x ...) metode melakukan proyeksi untuk setiap elemen koleksi objek . Jadi mengganti KeyValuePair baru dengan kamus baru akan membuat kamus kamus. Saya tidak berpikir itu yang Anda tuju.
Antoine Meltzheim
Saya memiliki daftar Kamus <string, string> dan sedang mencoba menggunakan pilih pada mereka tetapi melemparkan kesalahan kompilasi.
Amir Hajiha