Pengindeks ke Kamus mengeluarkan pengecualian jika kunci hilang. Apakah ada implementasi IDictionary yang akan mengembalikan default (T)?
Saya tahu tentang metode "TryGetValue", tapi itu tidak mungkin untuk digunakan dengan LINQ.
Apakah ini secara efisien akan melakukan apa yang saya butuhkan ?:
myDict.FirstOrDefault(a => a.Key == someKeyKalue);
Saya tidak berpikir itu akan karena saya pikir itu akan mengulangi kunci daripada menggunakan pencarian Hash.
c#
.net
hash
dictionary
Perangkat LunakJedi
sumber
sumber
Jawaban:
Memang, itu tidak akan efisien sama sekali.
Anda selalu bisa menulis metode ekstensi:
Atau dengan C # 7.1:
Itu menggunakan:
sumber
return (dictionary.ContainsKey(key)) ? dictionary[key] : default(TValue);
System.Collections.Generic.CollectionExtensions
, karena saya baru saja mencoba dan ada di sana.Membawa metode ekstensi ini dapat membantu ..
sumber
Func<K, V>
.Jika seseorang menggunakan .net core 2 dan di atasnya (C # 7.X), kelas CollectionExtensions diperkenalkan dan dapat menggunakan metode GetValueOrDefault untuk mendapatkan nilai default jika kunci tidak ada dalam kamus.
sumber
Collections.Specialized.StringDictionary
memberikan hasil non-pengecualian saat mencari nilai kunci yang hilang. Ini juga case-insensitive secara default.Peringatan
Ini hanya berlaku untuk penggunaan khusus, dan - dirancang sebelum obat generik - tidak memiliki enumerator yang sangat baik jika Anda perlu meninjau seluruh koleksi.
sumber
Jika Anda menggunakan .Net Core, Anda dapat menggunakan metode CollectionExtensions.GetValueOrDefault . Ini sama dengan implementasi yang disediakan dalam jawaban yang diterima.
sumber
sumber
Seseorang dapat mendefinisikan antarmuka untuk fungsi pencarian kunci kamus. Saya mungkin akan mendefinisikannya sebagai sesuatu seperti:
Versi dengan kunci non-generik akan memungkinkan kode yang menggunakan kode menggunakan tipe kunci non-struktur untuk memungkinkan varian kunci sewenang-wenang, yang tidak mungkin dilakukan dengan parameter tipe generik. Seseorang seharusnya tidak diizinkan untuk menggunakan yang bisa berubah
Dictionary(Of Cat, String)
sebagai yang bisa berubahDictionary(Of Animal, String)
karena yang terakhir akan memungkinkanSomeDictionaryOfCat.Add(FionaTheFish, "Fiona")
. Tetapi tidak ada yang salah dengan menggunakan bisa berubahDictionary(Of Cat, String)
sebagai tidak berubahDictionary(Of Animal, String)
, karenaSomeDictionaryOfCat.Contains(FionaTheFish)
harus dianggap sebagai ekspresi yang terbentuk dengan baik (harus kembalifalse
, tanpa harus mencari kamus, untuk apa pun yang bukan tipeCat
).Sayangnya, satu-satunya cara seseorang dapat benar-benar menggunakan antarmuka seperti itu adalah jika seseorang membungkus
Dictionary
objek di kelas yang mengimplementasikan antarmuka. Bergantung pada apa yang Anda lakukan, antarmuka seperti itu dan varians yang dibolehkan mungkin membuatnya sepadan.sumber
Jika Anda menggunakan ASP.NET MVC, Anda bisa memanfaatkan kelas RouteValueDictionary yang melakukan pekerjaan itu.
sumber
Pertanyaan ini membantu mengonfirmasi bahwa
TryGetValue
drama tersebutFirstOrDefault
peran di sini.Salah satu fitur C # 7 yang menarik yang ingin saya sebutkan adalah fitur variabel keluar , dan jika Anda menambahkan operator null-kondisional dari C # 6 ke persamaan kode Anda bisa jauh lebih sederhana tanpa perlu metode ekstensi tambahan.
Kelemahan dari ini adalah bahwa Anda tidak dapat melakukan semuanya sesuai seperti ini;
Jika kita perlu / ingin melakukan ini kita harus mengkode satu metode ekstensi seperti Jon.
sumber
Ini adalah versi dari @ JonSkeet untuk dunia C # 7.1 yang juga memungkinkan untuk melewatinya opsional opsional:
Mungkin lebih efisien untuk memiliki dua fungsi untuk mengoptimalkan kasing tempat Anda ingin kembali
default(TV)
:Sayangnya C # belum (belum?) Memiliki operator koma (atau operator titik koma C # 6 yang diusulkan) sehingga Anda harus memiliki badan fungsi aktual (terkesiap!) Untuk salah satu kelebihan beban.
sumber
Saya menggunakan enkapsulasi untuk membuat IDictionary dengan perilaku yang sangat mirip dengan peta STL , bagi Anda yang terbiasa dengan c ++. Bagi mereka yang tidak:
TL / DR - SafeDictionary ditulis agar tidak pernah membuat pengecualian dalam keadaan apa pun, selain skenario sesat , seperti komputer kehabisan memori (atau terbakar). Ini dilakukan dengan mengganti Add dengan perilaku AddOrUpdate dan mengembalikan default alih-alih melempar NotFoundException dari pengindeks.
Berikut kodenya:
sumber
Sejak .NET core 2.0 Anda dapat menggunakan:
sumber
Bagaimana dengan satu-liner ini yang memeriksa apakah kunci hadir menggunakan
ContainsKey
dan kemudian mengembalikan nilai yang biasanya diambil kembali atau nilai default menggunakan operator kondisional?Tidak perlu menerapkan kelas Kamus baru yang mendukung nilai default, cukup ganti pernyataan pencarian Anda dengan garis pendek di atas.
sumber
Ini bisa menjadi satu-liner untuk memeriksa
TryGetValue
dan mengembalikan nilai default jika yafalse
.myKey = "One"
=>value = 1
myKey = "two"
=>value = 100
myKey = "Four"
=>value = 4
Cobalah online
sumber
Tidak, karena jika tidak, bagaimana Anda tahu bedanya ketika kunci ada tetapi menyimpan nilai nol? Itu bisa penting.
sumber