Saya mencoba memeriksa null tetapi kompilator memperingatkan bahwa kondisi ini tidak akan pernah terjadi. Apa yang harus saya cari?
c#
dictionary
deltanovember.dll
sumber
sumber
ContainsKey
, yang benar, karena harus mengekstrak nilainya juga. Ini tidak melakukan dua pencarian.Kamus melontarkan
KeyNotFound
pengecualian jika kamus tidak berisi kunci Anda.Seperti yang disarankan,
ContainsKey
adalah tindakan pencegahan yang tepat.TryGetValue
juga efektif.Ini memungkinkan kamus menyimpan nilai null dengan lebih efektif. Tanpa itu berperilaku seperti ini, memeriksa hasil null dari operator [] akan menunjukkan baik nilai null ATAU tidak adanya kunci input yang tidak baik.
sumber
Jika Anda hanya memeriksa sebelum mencoba menambahkan nilai baru, gunakan
ContainsKey
metode:Jika Anda memeriksa bahwa nilainya ada, gunakan
TryGetValue
metode seperti yang dijelaskan dalam jawaban Jon Skeet.sumber
GetValueElseAdd
metode yang Anda beri nilai (atau aFunc<TValue>
) untuk juga menyimpan resolusi pada Sisipan jika Anda akan menambahkannya jika tidak ada. Saya kira alasan mengapa belum berhasil masuk ke libs .NET adalah karena jalur Tambah lebih jarang jika Anda menggunakannya dalam gaya cache]TryGetValue
akan lebih baik, tetapi jika Anda ingin memeriksa apakah kamus berisi kunci untuk menghindari penambahan duplikat, saya akan mengatakanContainsKey
sama baiknya (jika tidak lebih baik).Anda harus memeriksa Dictionary.ContainsKey (kunci int) sebelum mencoba menarik nilainya.
sumber
TryGetValue
. Syukurlah, saya melakukannya sekarang, jadi saya akan tahu di masa depan. Saya akan membiarkan jawaban ini utuh, meskipun diskusi karena itu berharga.TryGetValue
ekspresi lambda. Meskipun itu membuat saya berpikir ekstensi baru untuk C # akan menjadicatch
operator yang mirip dengannull
operator penggabungan.Kelas helper berguna:
sumber
ContainsKey adalah apa yang Anda cari.
sumber
Anda mungkin harus menggunakan:
Alasan mengapa Anda tidak dapat memeriksa null adalah karena kuncinya di sini adalah tipe nilai.
sumber
Jika kunci ada dalam kamus, ia mengembalikan nilai kunci jika tidak ia mengembalikan 0.
Semoga kode ini membantu Anda.
sumber
TryGetValue
sudah cukup, gunakanvalue
sebagai penggantiresult
Pertimbangkan opsi untuk mengenkapsulasi kamus khusus ini dan berikan metode untuk mengembalikan nilai untuk kunci itu:
Kemudian Anda dapat mengatur perilaku kamus ini.
Misalnya di sini: jika kamus tidak memiliki kunci, ia mengembalikan kunci yang Anda berikan parameter.
sumber