Boş değeri kontrol etmeyi denedim, ancak derleyici bu koşulun asla oluşmayacağı konusunda uyarıyor. Ne aramalıyım?
Boş değeri kontrol etmeyi denedim, ancak derleyici bu koşulun asla oluşmayacağı konusunda uyarıyor. Ne aramalıyım?
Yanıtlar:
Eğer anahtar eğer değerini almak istiyorum varsayarsak yapar exist, kullanımı 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
}
( ContainsKey
Ve sonra indeksleyici, anahtarın iki kez yukarı bakmasını sağlar, bu oldukça anlamsızdır.)
Hatta eğer Not edildi indeksleyiciyi için - null olmaz çalışmalarını kontrol referans türleri kullanarak Dictionary<,>
Eksik anahtarı talep halinde yerine null adlı dönen yerine, bir özel durum oluşturur. (Bu, Dictionary<,>
ve arasındaki büyük farktır Hashtable
.)
ContainsKey
, ki bu doğru, çünkü değeri de çıkarması gerekiyor. Yine de iki arama yapmıyor.
KeyNotFound
Sözlük, anahtarınızın anahtarınızı içermemesi durumunda bir istisna atar .
Önerildiği gibi ContainsKey
, uygun önlemdir. TryGetValue
aynı zamanda etkilidir.
Bu, sözlüğün null değerini daha etkin bir şekilde saklamasına izin verir. Bu şekilde davranmadan, [] operatöründen boş bir sonucun kontrol edilmesi ya bir boş değeri ya da giriş anahtarının var olmadığını gösterir ki bu iyi değildir.
Yeni bir değer eklemeyi denemeden önce kontrol ediyorsanız, şu ContainsKey
yöntemi kullanın :
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
Değerin var olup olmadığını kontrol ediyorsanız TryGetValue
, Jon Skeet'in cevabında açıklanan yöntemi kullanın .
GetValueElseAdd
bir değer (veya a Func<TValue>
) verdiğiniz yöntemlere de sahiptir . Sanırım .NET kitaplarına girememesinin nedeni, bir önbellek tarzında kullanıyorsanız Ekle yolunun daha az sıklıkta olmasıdır]
TryGetValue
, bunun daha iyi olacağını kabul ediyorum , ancak yinelenen eklemelerden kaçınmak için sözlüğün anahtarı içerip içermediğini kontrol etmek istiyorsanız, ContainsKey
(daha iyi değilse) aynı derecede iyi olduğunu söyleyebilirim .
Değeri çıkarmaya çalışmadan önce Dictionary.ContainsKey'i (int anahtar) kontrol etmelisiniz.
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
. Neyse ki şimdi yapıyorum, bu yüzden gelecekte bileceğim. Yine de bu yanıtı sağlam bırakacağım çünkü tartışma değerlidir.
TryGetValue
lambda ifadesinde kullanamazsınız . Yine de bu, C # için yeni bir uzantının catch
, null
birleştirme operatörüne benzer bir operatör olacağını düşündürüyor .
Yardımcı bir sınıf kullanışlıdır:
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 , aradığınız şey.
Muhtemelen kullanmalısınız:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
Boş değeri kontrol edememenizin nedeni, buradaki anahtarın bir değer türü olmasıdır.
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
Anahtar sözlükte mevcutsa, anahtarın değerini döndürür, aksi takdirde 0 döndürür.
Umarım bu kod size yardımcı olur.
TryGetValue
yeterli, value
yerineresult
Bu belirli sözlüğü kapsülleme seçeneğini düşünün ve bu anahtarın değerini döndürmek için bir yöntem sağlayın:
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;
}
}
Ardından bu sözlüğün davranışını yönetebilirsiniz.
Örneğin burada: eğer sözlükte anahtar yoksa, parametreye göre ilettiğiniz anahtarı döndürür.