KeyValuePair için varsayılan


392

Türünde bir nesne var IEnumerable<KeyValuePair<T,U>> keyValueList, kullanıyorum

 var getResult= keyValueList.SingleOrDefault();
 if(getResult==/*default */)
 {
 }
 else
 {
 } 

getResultDoğru öğeyi bulamamam durumunda varsayılan olup olmadığını nasıl kontrol edebilirim?

Bunun bir yapı olup olmadığını kontrol nulledemem, çünkü KeyValuePairbir yapıdır.


1
İşte bazı ilginç cevaplarla benzer bir soru: stackoverflow.com/q/793897/323071
Andre Luus

2
Ayrıca anahtarın sanki listenin boş olup olmadığını kontrol etmek için getResult.Key! = Null diyebilirsiniz
pengibot 10:02

3
@pengibot Anahtarın geçersiz sayılabileceğini varsayar.
Justin Skiles

Yanıtlar:


542

Bunu dene:

if (getResult.Equals(new KeyValuePair<T,U>()))

veya bu:

if (getResult.Equals(default(KeyValuePair<T,U>)))

5
Burada "yeni" seçeneği kavramını kullanabilirsiniz, ancak türü yeniden belirtmek zorunda kalmayın: if (getResult.Equals (Activator.CreateInstance (getResult.GetType ())))
kevinpo

3
Bence if (getResult.Equals(default))de işe yarıyor
Simon

2
@Simon hayır değil. defaultnull değerine eşittir. Ve default(KeyValuePair<T,U>)gerçek bir KeyValuePair içeren null, null. Bunu kendim yaşadım.
Yokovaski

100

Bunun gibi genel (ve genel) bir uzantı yöntemi oluşturabilirsiniz:

public static class Extensions
{
    public static bool IsDefault<T>(this T value) where T : struct
    {
        bool isDefault = value.Equals(default(T));

        return isDefault;
    }
}

Kullanımı:

// We have to set explicit default value '0' to avoid build error:
// Use of unassigned local variable 'intValue'
int intValue = 0;
long longValue = 12;
KeyValuePair<String, int> kvp1 = new KeyValuePair<String, int>("string", 11);
KeyValuePair<String, int> kvp2 = new KeyValuePair<String, int>();
List<KeyValuePair<String, int>> kvps = new List<KeyValuePair<String, int>> { kvp1, kvp2 };
KeyValuePair<String, int> kvp3 = kvps.FirstOrDefault(kvp => kvp.Value == 11);
KeyValuePair<String, int> kvp4 = kvps.FirstOrDefault(kvp => kvp.Value == 15);

Console.WriteLine(intValue.IsDefault()); // results 'True'
Console.WriteLine(longValue.IsDefault()); // results 'False'
Console.WriteLine(kvp1.IsDefault()); // results 'False'
Console.WriteLine(kvp2.IsDefault()); // results 'True'
Console.WriteLine(kvp3.IsDefault()); // results 'False'
Console.WriteLine(kvp4.IsDefault()); // results 'True'

27

Bunu dene:

KeyValuePair<string,int> current = this.recent.SingleOrDefault(r => r.Key.Equals(dialog.FileName) == true);

if (current.Key == null)
    this.recent.Add(new KeyValuePair<string,int>(dialog.FileName,0));

3
Tabii ki, bu sadece bir anahtar olarak null (yanlışlıkla veya kasten) null eklemeyecekseniz işe yarar. Ama zamanın büyük çoğunluğu doğru olduğunu söyleyebilirim, çok iyi bir fikir. Bu kesinlikle buradaki kontrollerin çoğundan daha basit bir kontrol.
neminem

3
Anahtar geçersiz olduğu sürece.
Uri Abramson

10
if(getResult.Key.Equals(default(T)) && getResult.Value.Equals(default(U)))

Tek şey derlenmemesidir. Bunun yerine eşittir kullanılmalıdır.
Tamas Ionut

8

Uzantı yöntemini kullanarak daha fazla anlayış yolu öneriyorum:

public static class KeyValuePairExtensions
{
    public static bool IsNull<T, TU>(this KeyValuePair<T, TU> pair)
    {
        return pair.Equals(new KeyValuePair<T, TU>());
    }
}

Ve sonra sadece şunu kullanın:

var countries = new Dictionary<string, string>
{
    {"cz", "prague"},
    {"de", "berlin"}
};

var country = countries.FirstOrDefault(x => x.Key == "en");

if(country.IsNull()){

}

7

Orijinal kodunuzdan, listenin boş olup olmadığını kontrol etmek istediğiniz gibi görünüyor:

var getResult= keyValueList.SingleOrDefault();
if (keyValueList.Count == 0)
{
   /* default */
}
else
{
}

Kullanılmadığı için sadece ilk satırı atlayabilirsiniz.
HeyJude

0

Bokstan kaçınmak için KeyValuePair.Equals(object)kullanabilirsiniz ValueTuple.

if ((getResult.Key, getResult.Value) == default)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.