Ich habe die folgende Zeile, bekomme aber immer noch eine Ausnahme " Sequenz enthält mehr als ein Element "
%Vor%Ich hatte gehofft, dass SingleOrDefault die Ausnahme vermeiden würde.
SingleOrDefault
gibt ein SINGLE -Element oder null zurück, wenn kein Element gefunden wurde. Wenn 2 Elemente in Ihrer Enumerable gefunden werden, wird die Ausnahme ausgelöst, die Sie sehen. Genau wie Highlander ... mit Single - es kann nur einen geben.
FirstOrDefault
gibt das gefundene FIRST -Element zurück oder null, wenn kein Element gefunden wird. Wenn also zwei Elemente mit Ihrem Prädikat übereinstimmen, wird der zweite ignoriert.
Angenommen, es ist Ihnen egal, ob es mehrere Übereinstimmungen gibt und Sie nur die erste oder null wollen, wenn keine Übereinstimmung gefunden wird ... dann möchten Sie wahrscheinlich Folgendes ...
%Vor% Beachten Sie, dass diese beiden Methoden nur ein Element zurückgeben, das sich nur dadurch unterscheidet, was sie tun, nachdem sie eine Übereinstimmung gefunden haben. First
beendet die Suche nach diesem Punkt und gibt das Ergebnis zurück. Single
überprüft den Rest der Liste, um sicherzustellen, dass keine Übereinstimmungen mehr vorhanden sind. Der OrDefault
-Teil bestimmt, was zurückgegeben wird, wenn keine Übereinstimmung gefunden wird. SingleOrDefault
oder FirstOrDefault
gibt null zurück, wenn kein Wert gefunden wird, aber wenn Sie nur Single
oder First
verwenden, dann MUSS es eine Übereinstimmung finden oder es wird eine Ausnahme ausgelöst.
BEARBEITEN: Guter Punkt Steve
Da First
das erste Element zurückgibt, müssen Sie möglicherweise OrderBy
verwenden, um sicherzustellen, dass das gewünschte Element tatsächlich das erste Element ist. Zum Beispiel ... angenommen, Ihr Objekt hatte eine UpdateDate-Eigenschaft und Sie wollten das Objekt mit dem neuesten UpdateDate ...
Wenn Sie eine Liste haben, konvertieren Sie die Liste in IEnumerable Liste, dann können Sie FirstOrDefault Methode
verwenden %Vor%Tags und Links c# c#-4.0 linq-to-entities