Saya punya daftar objek Person. Saya ingin mengonversi ke Kamus di mana kuncinya adalah nama depan dan belakang (digabungkan) dan nilainya adalah objek Orang.
Masalahnya adalah saya memiliki beberapa orang yang terduplikasi, jadi ini meledak jika saya menggunakan kode ini:
private Dictionary<string, Person> _people = new Dictionary<string, Person>();
_people = personList.ToDictionary(
e => e.FirstandLastName,
StringComparer.OrdinalIgnoreCase);
Saya tahu ini kedengarannya aneh, tetapi saya tidak begitu peduli dengan nama duplikat untuk saat ini. Jika ada banyak nama, saya hanya ingin mengambil satu. Apakah ada yang bisa saya tuliskan kode ini di atas sehingga hanya membutuhkan satu nama dan tidak meledak pada duplikat?
c#
linq
dictionary
leora
sumber
sumber
Dictionary<string, List<Person>>
(atau setara).Distinct
Jawaban:
Inilah solusi yang jelas dan tidak linq:
sumber
Solusi LINQ:
Jika Anda lebih suka solusi non-LINQ maka Anda dapat melakukan sesuatu seperti ini:
sumber
Solusi Linq menggunakan Distinct () dan dan tanpa pengelompokan adalah:
Saya tidak tahu apakah itu lebih baik daripada solusi LukeH tetapi berfungsi juga.
sumber
Ini harus bekerja dengan ekspresi lambda:
sumber
personList.Distinct().ToDictionary(i => i.FirstandLastName, i => i);
Anda juga dapat menggunakan
ToLookup
fungsi LINQ, yang kemudian dapat Anda gunakan hampir secara bergantian dengan Kamus.Ini pada dasarnya akan melakukan GroupBy dalam jawaban LukeH , tetapi akan memberikan hashing bahwa Kamus menyediakan. Jadi, Anda mungkin tidak perlu mengubahnya ke Kamus, tetapi cukup gunakan
First
fungsi LINQ setiap kali Anda perlu mengakses nilai untuk kunci.sumber
Anda dapat membuat metode ekstensi yang mirip dengan ToDictionary () dengan perbedaannya yaitu memungkinkan duplikat. Sesuatu seperti:
Dalam hal ini, jika ada duplikat, maka nilai terakhir yang menang.
sumber
Untuk menangani menghilangkan duplikat, implementasikan metode
IEqualityComparer<Person>
yang dapat digunakan dalamDistinct()
metode ini, dan kemudian mendapatkan kamus Anda akan mudah. Diberikan:Dapatkan kamus Anda:
sumber
sumber
Jika kita ingin semua Orang (bukan hanya satu Orang) dalam kamus yang kembali, kita dapat:
sumber
Masalah dengan sebagian besar jawaban lain adalah bahwa mereka menggunakan
Distinct
,GroupBy
atauToLookup
, yang menciptakan Kamus tambahan di bawah tenda. Sama dengan ToUpper menciptakan string ekstra. Inilah yang saya lakukan, yang merupakan salinan persis kode Microsoft kecuali satu perubahan:Karena satu set pada indexer menyebabkannya menambahkan kunci, itu tidak akan membuang, dan juga hanya akan melakukan satu pencarian kunci. Anda juga dapat memberikannya
IEqualityComparer
, misalnyaStringComparer.OrdinalIgnoreCase
sumber
Mulai dari solusi Carra, Anda juga dapat menuliskannya sebagai:
sumber