Hier ist eine vereinfachte Version von dem, was ich versuche zu tun:
var days = new Dictionary<int, string>();
days.Add(1, "Monday");
days.Add(2, "Tuesday");
...
days.Add(7, "Sunday");
var sampleText = "My favorite day of the week is 'xyz'";
var day = days.FirstOrDefault(x => sampleText.Contains(x.Value));
Da 'xyz' im Wörterbuch nicht vorhanden ist, gibt die FirstOrDefault-Methode keinen gültigen Wert zurück. Ich möchte in der Lage sein, nach dieser Situation zu suchen, aber mir ist klar, dass ich das Ergebnis nicht mit "null" vergleichen kann, da KeyValuePair eine Struktur ist. Der folgende Code ist ungültig:
if (day == null) {
System.Diagnotics.Debug.Write("Couldn't find day of week");
}
Wenn Sie versuchen, den Code zu kompilieren, gibt Visual Studio den folgenden Fehler aus:
Operator '==' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<int,string>' and '<null>'
Wie kann ich überprüfen, ob FirstOrDefault einen gültigen Wert zurückgegeben hat?
Antworten:
FirstOrDefault
gibt nicht null zurück, sondern zurückdefault(T)
.Sie sollten überprüfen nach:
Von MSDN -
Enumerable.FirstOrDefault<TSource>
:Anmerkungen:
EqualityComparer<T>.Default.Equals(day, defaultDay)
, da er.Equals
möglicherweise überschrieben wird oderday
einnull
.KeyValuePair<int, string> defaultDay = default;
, siehe Ziel-typisiertes "Standard" -Literal .FirstOrDefault
quelle
typeof
? Dieser Code wird kompiliert und funktioniert.default(KeyValuePair<T1, T2>)
resultieren würde. Ok, es hätte ziemlich offensichtlich sein müssen, dass es zu einem leeren KVP führen würde. Da "offensichtlich sein" kein guter Ansatz ist, um richtige Anwendungen zu schreiben (und meine aktuelle Implementierung zu komplex ist, um diesen Fall klar / sauber zu provozieren), habe ich es mit einem neuen Projekt versucht und - in der Tat - einKeyValuePair
mit EigenschaftenKey
undValue
Sein zurückgegeben beidesNULL
.... nur um ein paar anderen Leuten diese 5 Minuten Dummheit zu ersparen ;-)default
Keyword hinzugefügt, der hier eindeutig fehlt. Vielen Dank!KeyValuePair
. Wenn Sie generischen Code hätten,day.Equals
ist nicht einmal null-sicher, und ich hätte verwendetEqualityComparer<T>.Default.Equals(day, defaultDay)
Dies ist meiner Meinung nach der klarste und prägnanteste Weg:
Dies wird vollständig umgangen, indem seltsame Standardwerte für Strukturen verwendet werden.
quelle
days
aDictionary<int,string>
. Es wird also als betrachtetIEnumerable<KeyValuePair<int,string>>
und verhält sich dann wie erwartet, wennAny()
undFirst()
aufgerufen werden. Ich denke, dass es andere Implementierungen gibt, die sich anders verhalten können alsIEnumerable<>
. Ich weiß nicht, ob mir etwas fehlt.Sie können dies stattdessen tun:
und dann :
quelle