Saya mencoba memeriksa null tetapi kompilator memperingatkan bahwa kondisi ini tidak akan pernah terjadi. Apa yang harus saya cari?
Saya mencoba memeriksa null tetapi kompilator memperingatkan bahwa kondisi ini tidak akan pernah terjadi. Apa yang harus saya cari?
Jawaban:
Dengan asumsi Anda ingin mendapatkan nilai jika kunci tidak ada, gunakan Dictionary<TKey, TValue>.TryGetValue:
int value;
if (dictionary.TryGetValue(key, out value))
{
// Key was in dictionary; "value" contains corresponding value
}
else
{
// Key wasn't in dictionary; "value" is now 0
}
(Menggunakan ContainsKeydan kemudian pengindeks membuatnya mencari kunci dua kali, yang tidak ada gunanya.)
Perhatikan bahwa bahkan jika Anda sedang menggunakan referensi jenis, memeriksa nol tidak akan bekerja - pengindeks untuk Dictionary<,>akan melemparkan pengecualian jika Anda meminta kunci hilang, daripada kembali nol. (Ini adalah perbedaan besar antara Dictionary<,>dan Hashtable.)
ContainsKey, yang benar, karena harus mengekstrak nilainya juga. Ini tidak melakukan dua pencarian.
Kamus melontarkan KeyNotFoundpengecualian jika kamus tidak berisi kunci Anda.
Seperti yang disarankan, ContainsKeyadalah tindakan pencegahan yang tepat. TryGetValuejuga 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.
Jika Anda hanya memeriksa sebelum mencoba menambahkan nilai baru, gunakan ContainsKeymetode:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
Jika Anda memeriksa bahwa nilainya ada, gunakan TryGetValuemetode seperti yang dijelaskan dalam jawaban Jon Skeet.
GetValueElseAddmetode yang Anda beri nilai (atau a Func<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]
TryGetValueakan lebih baik, tetapi jika Anda ingin memeriksa apakah kamus berisi kunci untuk menghindari penambahan duplikat, saya akan mengatakan ContainsKeysama baiknya (jika tidak lebih baik).
Anda harus memeriksa Dictionary.ContainsKey (kunci int) sebelum mencoba menarik nilainya.
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);
int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
myValueLookup = myDictionay[keyToFind];
// do work...
}
else
{
// the key doesn't exist.
}
TryGetValue. Syukurlah, saya melakukannya sekarang, jadi saya akan tahu di masa depan. Saya akan membiarkan jawaban ini utuh, meskipun diskusi karena itu berharga.
TryGetValueekspresi lambda. Meskipun itu membuat saya berpikir ekstensi baru untuk C # akan menjadi catchoperator yang mirip dengan nulloperator penggabungan.
Kelas helper berguna:
public static class DictionaryHelper
{
public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
{
TVal val;
if( dictionary.TryGetValue(key, out val) )
{
return val;
}
return defaultVal;
}
}
ContainsKey adalah apa yang Anda cari.
Anda mungkin harus menggunakan:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
Alasan mengapa Anda tidak dapat memeriksa null adalah karena kuncinya di sini adalah tipe nilai.
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
Jika kunci ada dalam kamus, ia mengembalikan nilai kunci jika tidak ia mengembalikan 0.
Semoga kode ini membantu Anda.
TryGetValuesudah cukup, gunakan valuesebagai penggantiresult
Pertimbangkan opsi untuk mengenkapsulasi kamus khusus ini dan berikan metode untuk mengembalikan nilai untuk kunci itu:
public static class NumbersAdapter
{
private static readonly Dictionary<string, string> Mapping = new Dictionary<string, string>
{
["1"] = "One",
["2"] = "Two",
["3"] = "Three"
};
public static string GetValue(string key)
{
return Mapping.ContainsKey(key) ? Mapping[key] : key;
}
}
Kemudian Anda dapat mengatur perilaku kamus ini.
Misalnya di sini: jika kamus tidak memiliki kunci, ia mengembalikan kunci yang Anda berikan parameter.