Значение по умолчанию для KeyValuePair
у меня есть объект типа IEnumerable<KeyValuePair<T,U>> keyValueList
, Я использую
var getResult= keyValueList.SingleOrDefault();
if(getResult==/*default */)
{
}
else
{
}
как я могу проверить, является ли getResult
по умолчанию, в случае если я не могу найти правильный элемент?
Я не могу проверить, является ли это null
или нет, потому что KeyValuePair
является struct.
7 ответов:
попробуйте это:
if (getResult.Equals(new KeyValuePair<T,U>()))
или такой:
if (getResult.Equals(default(KeyValuePair<T,U>)))
вы можете создать общий (и общий) метод расширения, как этот:
public static class Extensions { public static bool IsDefault<T>(this T value) where T : struct { bool isDefault = value.Equals(default(T)); return isDefault; } }
использование:
// 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'
попробуйте это:
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));
из вашего исходного кода, похоже, что вы хотите, чтобы проверить, если список был пуст:
var getResult= keyValueList.SingleOrDefault(); if (keyValueList.Count == 0) { /* default */ } else { }
начиная с C# 7.1, вы можете использовать the
default
литерал с выводом типа для упрощения выражения:var getResult= keyValueList.SingleOrDefault(); if(getResult.Equals(default)) { } else { }
Я рекомендую более понятный способ использования метода расширения:
public static class KeyValuePairExtensions { public static bool IsNull<T, TU>(this KeyValuePair<T, TU> pair) { return pair.Equals(new KeyValuePair<T, TU>()); } }
а потом просто использовать:
var countries = new Dictionary<string, string> { {"cz", "prague"}, {"de", "berlin"} }; var country = countries.FirstOrDefault(x => x.Key == "en"); if(country.IsNull()){ }