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.

War es hilfreich?

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()){

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top