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.

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"


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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.