Question

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 pourrais pas trouver le bon élément?

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

Était-ce utile?

La solution

Essayez ceci:

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

ou ceci:

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

Autres conseils

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;
    }
}

Utilisation:

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

Essayez ceci:

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

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

var getResult= keyValueList.SingleOrDefault();

if(getResult.Equals(default))
{
}
else
{
} 
if(getResult.Key.Equals(default(T)) && getResult.Value.Equals(default(U)))

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

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

Je recommande de mieux comprendre 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>());
    }
}

Ensuite, utilisez simplement:

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

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

if(country.IsNull()){

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top