web-dev-qa-db-fra.com

La valeur par défaut pour KeyValuePair

J'ai un objet du type IEnumerable<KeyValuePair<T,U>> keyValueList, j'utilise

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

Comment puis-je vérifier si getResult est la valeur par défaut, au cas où je ne trouverais pas le bon élément?

Je ne peux pas vérifier si c'est null ou pas, parce que KeyValuePair est une structure.

360
Graviton

Essaye ça:

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

ou ca:

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

Vous pouvez créer une méthode d'extension générale (et générique), comme celle-ci:

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

        return isDefault;
    }
}

Usage:

// 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'
90
pholpar

Essaye ça:

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));
23
Peter

À partir de C # 7.1, vous pouvez utiliser le default littéral avec inférence de type pour simplifier l'expression:

var getResult= keyValueList.SingleOrDefault();

if(getResult.Equals(default))
{
}
else
{
} 
20
Toby J
if(getResult.Key.Equals(default(T)) && getResult.Value.Equals(default(U)))
8
ChaosPandion

À partir de votre code d'origine, il semble que ce que vous voulez est de vérifier si la liste était vide:

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

Je recommande de manière plus compréhensive en utilisant la méthode d'extension:

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

Et puis juste utiliser:

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

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

if(country.IsNull()){

}
5
Miroslav Holec