Permintaan LINQ untuk mengembalikan Kamus <string, string>

218

Saya memiliki koleksi MyClass yang ingin saya kueri menggunakan LINQ untuk mendapatkan nilai yang berbeda, dan mendapatkan kembali Kamus <string, string> sebagai hasilnya, tapi saya tidak tahu bagaimana saya bisa melakukannya lebih sederhana daripada saya sedang melakukan di bawah ini. Apa kode pembersih yang dapat saya gunakan untuk mendapatkan Kamus <string, string> sebagai hasil saya?

var desiredResults = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

var queryResults = (from MyClass mc in myClassCollection
                    orderby bp.SomePropToSortOn
                    select new KeyValuePair<string, string>(mc.KeyProp, mc.ValueProp)).Distinct();

foreach (var item in queryResults)
{
    desiredResults.Add(item.Key.ToString(), item.Value.ToString());
}
Scott Ivey
sumber
6
Apa yang ingin Anda lakukan dengan kunci duplikat? Ambil saja yang pertama dan abaikan yang berikutnya? Sadarilah bahwa kamus tidak memerintahkan, sehingga pemesanan Anda di query tidak akan berpengaruh ...
Jon Skeet
1
Mungkin yang Anda cari adalah implementasi IDedtionary dari SortedDictionary. Kalau tidak, pengurutan Kamus tidak ada gunanya.
Fede

Jawaban:

366

Gunakan ToDictionarymetode ini secara langsung.

var result = 
  // as Jon Skeet pointed out, OrderBy is useless here, I just leave it 
  // show how to use OrderBy in a LINQ query
  myClassCollection.OrderBy(mc => mc.SomePropToSortOn)
                   .ToDictionary(mc => mc.KeyProp.ToString(), 
                                 mc => mc.ValueProp.ToString(), 
                                 StringComparer.OrdinalIgnoreCase);
Mehrdad Afshari
sumber
1
Mehrdad, terima kasih untuk petunjuknya. Ini adalah arah yang saya tuju, tetapi karena pasti telah melihat kelebihan ToDictionary.
Scott Ivey
18

Lihatlah metode ToLookupdan / atau ToDictionaryekstensi.

leppie
sumber