Die Standardeinstellung für KeyValuePair


392

Ich habe ein Objekt des Typs IEnumerable<KeyValuePair<T,U>> keyValueList, den ich benutze

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

Wie kann ich überprüfen, ob dies getResultdie Standardeinstellung ist, falls ich das richtige Element nicht finden kann?

Ich kann nicht überprüfen, ob es ist nulloder nicht, weil KeyValuePaires eine Struktur ist.


1
Hier ist eine ähnliche Frage mit einigen interessanten Antworten: stackoverflow.com/q/793897/323071
Andre Luus

2
Sie können auch getResult.Key! = Null sagen, um zu überprüfen, ob die Liste null ist, als ob es der Schlüssel ist, wird immer null sein
Pengibot

3
@pengibot Dies setzt voraus, dass der Schlüssel nullbar ist.
Justin Skiles

Antworten:


542

Versuche dies:

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

oder dieses:

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

5
Sie können das Konzept der "neuen" Option hier verwenden, müssen jedoch den Typ nicht erneut angeben: if (getResult.Equals (Activator.CreateInstance (getResult.GetType ()))
kevinpo

3
Ich denke if (getResult.Equals(default))auch funktioniert
Simon

2
@ Simon nein tut es nicht. defaultgleich null. Und default(KeyValuePair<T,U>)ist ein aktuelles KeyValuePair, das enthält null, null. Ich habe das selbst erlebt.
Yokovaski

100

Sie können eine allgemeine (und generische) Erweiterungsmethode wie die folgende erstellen:

public static class Extensions
{
    public static bool IsDefault<T>(this T value) where T : struct
    {
        bool isDefault = value.Equals(default(T));

        return isDefault;
    }
}

Verwendungszweck:

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

27

Versuche dies:

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

3
Das funktioniert natürlich nur, wenn Sie niemals (versehentlich oder absichtlich) null als Schlüssel hinzufügen. Aber ich würde sagen, das stimmt die meiste Zeit, also eine gute Idee. Das ist definitiv eine viel einfachere Prüfung als die meisten Prüfungen hier.
Neminem

3
Solange der Schlüssel nullbar ist.
Uri Abramson

10
if(getResult.Key.Equals(default(T)) && getResult.Value.Equals(default(U)))

Das einzige ist, dass nicht kompiliert wird. Gleich sollte stattdessen verwendet werden.
Tamas Ionut

8

Ich empfehle, die Erweiterungsmethode besser zu verstehen:

public static class KeyValuePairExtensions
{
    public static bool IsNull<T, TU>(this KeyValuePair<T, TU> pair)
    {
        return pair.Equals(new KeyValuePair<T, TU>());
    }
}

Und dann benutze einfach:

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

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

if(country.IsNull()){

}

7

Aus Ihrem ursprünglichen Code geht hervor, dass Sie überprüfen möchten, ob die Liste leer war:

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

Sie können die erste Zeile einfach weglassen, da sie nicht verwendet wird.
HeyJude

0

Um das Boxen von zu vermeiden KeyValuePair.Equals(object), können Sie a ValueTuple.

if ((getResult.Key, getResult.Value) == default)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.