Der Standardwert für KeyValuePair
Frage
Ich habe ein Objekt vom Typ IEnumerable<KeyValuePair<T,U>> keyValueList
, ich bin mit
var getResult= keyValueList.SingleOrDefault();
if(getResult==/*default */)
{
}
else
{
}
Wie kann ich überprüfen, ob getResult
der Standard ist, für den Fall kann ich nicht das richtige Element finden?
Ich kann nicht überprüfen, ob es null
ist oder nicht, weil KeyValuePair
eine Struktur ist.
Lösung
Versuchen Sie folgendes:
if (getResult.Equals(new KeyValuePair<T,U>()))
oder folgt aus:
if (getResult.Equals(default(KeyValuePair<T,U>)))
Andere Tipps
Sie können eine allgemeine erstellen (und allgemeinen) Extension-Methode, wie diese:
public static class Extensions
{
public static bool IsDefault<T>(this T value) where T : struct
{
bool isDefault = value.Equals(default(T));
return isDefault;
}
}
Verbrauch:
// 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'
Versuchen Sie folgendes:
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));
Wie von C # 7.1, können Sie a href verwenden <= "https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/default-value-expressions# default-literal-und-Typ-Inferenz“rel = "noreferrer"> die default
wörtliche mit Typinferenz den Ausdruck zu vereinfachen:
var getResult= keyValueList.SingleOrDefault();
if(getResult.Equals(default))
{
}
else
{
}
if(getResult.Key.Equals(default(T)) && getResult.Value.Equals(default(U)))
Von Ihrem ursprünglichen Code sieht es aus wie das, was Sie wollen ist zu prüfen, ob die Liste leer war:
var getResult= keyValueList.SingleOrDefault();
if (keyValueList.Count == 0)
{
/* default */
}
else
{
}
Ich empfehle mehr Verständnis Art und Weise unter Verwendung von Erweiterungsmethode:
public static class KeyValuePairExtensions
{
public static bool IsNull<T, TU>(this KeyValuePair<T, TU> pair)
{
return pair.Equals(new KeyValuePair<T, TU>());
}
}
Und dann nur verwenden:
var countries = new Dictionary<string, string>
{
{"cz", "prague"},
{"de", "berlin"}
};
var country = countries.FirstOrDefault(x => x.Key == "en");
if(country.IsNull()){
}