Lange Geschichte kurz. Ich habe 2 Listen, die den gleichen Typ enthalten (aber für verschiedene Dinge verwendet werden) und ich möchte wissen, ob die EITHER-Liste einen Artikel mit einem bestimmten Namen enthält.Lambda Ausdruck Kuriosität
Meine ursprüngliche Code, der prefectly arbeitete, war:
if (listA.Any(var => var.Name == strMatch) || listB.Any(var => var.Name == strMatch))
{
//Do something
}
Dieser Code perfekt funktioniert, ob das Element in einer der beiden Listen vorhanden war. Später hatte ich mehrere "unmögliche" Abstürze - Dinge, die nie hätte passieren können. Ich verfolgte es zurück, wenn die Anweisung NIE wahr zurückgibt.
Das hat mich schon ewig beschäftigt ... Ich konnte nicht herausfinden, was falsch lief. Schließlich gab ich es auf und steckte Klammern um den Körper der Lamda Ausdrücke wie so ...
if (listA.Any(var => (var.Name == strMatch)) || listB.Any(var => (var.Name == strMatch)))
{
//Do something
}
nach erneuter läuft mein Programm, alle ‚unmöglich‘ Fehler ging weg und es funktioniert normal. Durch das Entfernen der zusätzlichen Backets werden die Fehler erneut angezeigt.
Ich hatte noch nie dieses Problem mit Lambda-Ausdrücke (vor allem, wo sie arbeiten und dann, nach mehreren Läufen funktioniert ordnungsgemäß Pause) und meine anderen Lambda-Ausdrücke funktionieren ordnungsgemäß.
Beispiel: Der folgende Code funktioniert 100%, wie erwartet (Unter der Annahme, dass es eine Übereinstimmung in einer der Listen ist)
Item item =
ListA.FirstOrDefault(var => var.Name == strMatch) ??
ListB.FirstOrDefault(var => var.Name == strMatch);
Was ist los? Warum ist der Compiler wählerisch über einige Lambda-Ausdrücke und nicht andere? (Auch wenn sie identisch sind?) ???
UPDATE :: Systemdetails Dies wurde mit Microsoft Visual Studio 2008 (Professional), Windows Vista 32bit festgestellt.
UPDATE Video link, hat dieser Test auf anderen Computern gewesen und ist NICHT reproduzierbare. Ich fühle mich wie mein Computer verloren ist. Die Neuinstallation von VS hat keine Auswirkungen.
Bitte ignoriere Hintergrundgeräusche, sie miaut nur viel, wenn sie mich etwas aufzeichnen hört.
Ist das der tatsächliche verbatim-Code, der sich merkwürdig verhält? – LukeH
Wenn Sie dies tatsächlich reproduzieren können, sollten Sie auf Ihrem eigenen Computer mehr Schritte unternehmen, um das Problem zu identifizieren, z. Was unterscheidet den Bytecode beim Hinzufügen oder Entfernen der Klammern? – mquander
Der Code ist wörtlich, mit der Ausnahme, dass die Namen der Listen geändert wurden, um das Auslesen des Kontexts zu erleichtern, und der tatsächliche Typ heißt "Variable", nicht "Item". – James