La valeur par défaut pour KeyValuePair
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.
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()){
}