Ich habe mich umgesehen und keine klare Antwort gefunden, wann Sie es verwenden möchten .First
und wann Sie es .FirstOrDefault
mit LINQ verwenden möchten .
Wann möchten Sie verwenden
.First
? Nur wenn Sie die Ausnahme abfangen möchten, wenn keine Ergebnisse zurückgegeben wurden?var result = List.Where(x => x == "foo").First();
Und wann möchten Sie verwenden
.FirstOrDefault
? Wann möchten Sie immer den Standardtyp, wenn kein Ergebnis?var result = List.Where(x => x == "foo").FirstOrDefault();
Und was ist mit Take?
var result = List.Where(x => x == "foo").Take(1);
.First
und.FirstOrDefault
beide nehmen Prädikate als Argumente,var result = List.Where(x => x == "foo").First();
könnten also umgeschrieben werden alsvar result = List.First(x => x == "foo");
Single
undSingleOrDefault
. Ich hasse es, wenn Leute benutzen,First
wenn sie es wirklich meinenSingle
; ).FirstOrDefault()
immer die Möglichkeit bietet, eine aussagekräftigere Ausnahme auszulösen. Wenn eine Sequenzausnahme ausgelöst wird und mehrere.First()
in einer Methode enthalten sind, kann es schwierig sein, zu erkennen, welche Anweisung das Problem ist.Antworten:
Ich würde verwenden,
First()
wenn ich weiß oder erwarte, dass die Sequenz mindestens ein Element enthält. Mit anderen Worten, wenn es ein außergewöhnliches Ereignis ist, dass die Sequenz leer ist.Verwenden
FirstOrDefault()
Sie diese Option, wenn Sie wissen, dass Sie überprüfen müssen, ob ein Element vorhanden ist oder nicht. Mit anderen Worten, wenn es legal ist, dass die Sequenz leer ist. Sie sollten sich bei der Prüfung nicht auf die Ausnahmebehandlung verlassen. (Es ist eine schlechte Übung und kann die Leistung beeinträchtigen).Schließlich besteht der Unterschied zwischen
First()
undTake(1)
darin, dassFirst()
das Element selbst zurückgegeben wird, währendTake(1)
eine Folge von Elementen zurückgegeben wird, die genau ein Element enthält.quelle
.First
löst eine Ausnahme aus, wenn keine Ergebnisse vorliegen..FirstOrDefault
wird nicht, es wird einfach entweder null (Referenztypen) oder der Standardwert des Werttyps zurückgegeben. (zB wie0
für ein int.) Die Frage hier ist nicht, wann Sie den Standardtyp wollen, sondern mehr: Sind Sie bereit, eine Ausnahme oder einen Standardwert zu behandeln? Da Ausnahmen außergewöhnlich sein sollten,FirstOrDefault
wird sie bevorzugt, wenn Sie nicht sicher sind, ob Sie Ergebnisse aus Ihrer Abfrage erhalten. Wenn die Daten logisch vorhanden sein sollten, kann die Ausnahmebehandlung in Betracht gezogen werden.Skip()
undTake()
werden normalerweise beim Einrichten von Paging in Ergebnissen verwendet. (Wie das Anzeigen der ersten 10 Ergebnisse und der nächsten 10 auf der nächsten Seite usw.)Hoffe das hilft.
quelle
.FirstOrDefault
die für Referenztypen null zurückgibt. Ich war verwirrt darüber, was ein "Standard" -Objekt sein würde. Diese Antwort hat das geklärt..First()
löst eine Ausnahme aus, wenn keine Zeile zurückgegeben werden soll, und.FirstOrDefault()
gibtNULL
stattdessen den Standardwert ( für alle Referenztypen) zurück.Wenn Sie also bereit und bereit sind, eine mögliche Ausnahme zu behandeln,
.First()
ist dies in Ordnung. Wenn Sie den Rückgabewert!= null
trotzdem überprüfen möchten ,.FirstOrDefault()
ist dies die bessere Wahl.Aber ich denke, es ist auch eine persönliche Präferenz. Verwenden Sie, was für Sie sinnvoller ist und besser zu Ihrem Codierungsstil passt.
quelle
Zuerst()
FirstOrDefault ()
Wir haben eine UserInfos-Tabelle, die einige Datensätze enthält, wie unten gezeigt. Auf der Grundlage dieser Tabelle unten habe ich ein Beispiel erstellt ...
Verwendung von First ()
Es gibt nur einen Datensatz, in dem ID == 1. Sollte diese Datensatz-
ID zurückgeben: 1 Vorname: Manish Nachname: Dubey E-Mail: [email protected]
Es gibt mehrere Datensätze, in denen FName == "Rahul". Die erste Aufzeichnung sollte zurückgegeben werden.
ID: 7 Vorname: Rahul Nachname: Sharma E-Mail: [email protected]
Es gibt keinen Datensatz mit der ID == 13. Es sollte ein Fehler auftreten.
InvalidOperationException: Die Sequenz enthält keine Elemente
Verwendung von FirstOrDefault ()
Es gibt nur einen Datensatz, in dem ID == 1. Sollte diese Datensatz-
ID zurückgeben: 1 Vorname: Manish Nachname: Dubey E-Mail: [email protected]
Es gibt mehrere Datensätze, in denen FName == "Rahul". Die erste Aufzeichnung sollte zurückgegeben werden.
ID: 7 Vorname: Rahul Nachname: Sharma E-Mail: [email protected]
Es gibt keinen Datensatz mit der ID == 13. Der Rückgabewert ist null
Hoffe, es wird Ihnen helfen zu verstehen, wann
First()
oder verwendenFirstOrDefault()
.quelle
Zunächst einmal
Take
ist eine ganz andere Methode. Es gibt eineIEnumerable<T>
und keine einzige zurückT
, also ist das raus.Zwischen
First
undFirstOrDefault
sollten Sie verwenden,First
wenn Sie sicher sind, dass ein Element vorhanden ist, und wenn dies nicht der Fall ist, liegt ein Fehler vor.Übrigens, wenn Ihre Sequenz
default(T)
Elemente enthält (z. B.null
) und Sie zwischen leer und dem ersten Element unterscheiden müssen,null
können Sie nicht verwendenFirstOrDefault
.quelle
Zuerst:
FirstOrDefault:
Von: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
quelle
Ein weiterer zu beachtender Unterschied besteht darin, dass Sie beim Debuggen einer Anwendung in einer Produktionsumgebung möglicherweise keinen Zugriff auf Zeilennummern haben. Daher
.First()
kann es schwierig sein , festzustellen, welche bestimmte Anweisung in einer Methode die Ausnahme ausgelöst hat.Die Ausnahmemeldung enthält auch keine Lambda-Ausdrücke, die Sie möglicherweise verwendet haben, wodurch Probleme noch schwieriger zu debuggen sind.
Deshalb benutze ich immer
FirstOrDefault()
, obwohl ich weiß, dass ein Null-Eintrag eine Ausnahmesituation darstellen würde.quelle
Zuerst()
Wenn Sie wissen, dass das Ergebnis mehr als 1 erwartetes Element enthält, sollten Sie nur das erste Element der Sequenz verwenden.
FirstOrDefault ()
FirstOrDefault () ist genau wie First (), außer dass, wenn kein Element der angegebenen Bedingung entspricht, der Standardwert des zugrunde liegenden Typs der generischen Sammlung zurückgegeben wird. Es wird keine InvalidOperationException ausgelöst, wenn kein Element gefunden wurde. Die Sammlung von Elementen oder Sequenzen ist jedoch null, als sie eine Ausnahme auslöst.
quelle
Dieser Funktionstyp gehört zu Elementoperatoren. Einige nützliche Elementoperatoren sind unten definiert.
Wir verwenden Elementoperatoren, wenn wir ein einzelnes Element aus einer Sequenz basierend auf einer bestimmten Bedingung auswählen müssen. Hier ist ein Beispiel.
Der Operator First () gibt das erste Element einer Sequenz zurück, nachdem die Bedingung erfüllt wurde. Wenn kein Element gefunden wird, wird eine Ausnahme ausgelöst.
int result = items.Where (item => item == 2) .First ();
Der Operator FirstOrDefault () gibt das erste Element einer Sequenz zurück, nachdem die Bedingung erfüllt wurde. Wenn kein Element gefunden wird, wird der Standardwert dieses Typs zurückgegeben.
int result1 = items.Where (item => item == 2) .FirstOrDefault ();
quelle
Ich habe eine Website, die die Notwendigkeit für FirstOrDefault zu erklären apperars
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
Wenn es keine Ergebnisse einer Abfrage sind, und Sie wollen zunächst anrufen () oder Single (), um eine einzelne Zeile zu erhalten ... Sie erhalten die Ausnahme "Sequenz enthält keine Elemente".
Haftungsausschluss: Ich habe LINQ noch nie verwendet. Ich entschuldige mich, wenn dies nicht der Fall ist.
quelle
Welches verwenden? Dies sollte von der Geschäftslogik entschieden werden und nicht von der Angst vor Ausnahmen / Programmfehlern.
Zum Beispiel, wenn die Geschäftslogik besagt, dass wir an keinem Arbeitstag keine Transaktionen durchführen können (nehmen Sie einfach an). Dann sollten Sie nicht versuchen, dieses Szenario mit einer intelligenten Programmierung zu behandeln. Ich werde immer First () für eine solche Sammlung verwenden und das Programm fehlschlagen lassen, wenn etwas anderes die Geschäftslogik durcheinander gebracht hat.
Code:
Ich würde gerne andere Kommentare dazu sehen.
quelle
Ok, lass mich meine zwei Cent geben. First / Firstordefault sind für die Verwendung des zweiten Konstruktors vorgesehen. Ich werde nicht erklären, was es ist, aber es ist, wenn Sie möglicherweise immer eine verwenden würden, weil Sie keine Ausnahme verursachen möchten.
quelle
Andere haben den Unterschied zwischen
First()
und sehr gut beschriebenFirstOrDefault()
. Ich möchte einen weiteren Schritt zur Interpretation der Semantik dieser Methoden machen. Meiner Meinung nachFirstOrDefault
wird viel überbeansprucht. In den meisten Fällen erwarten Sie beim Filtern von Daten entweder eine Sammlung von Elementen, die der logischen Bedingung entsprechen, oder ein einzelnes eindeutiges Element anhand seiner eindeutigen Kennung - wie z. B. ein Benutzer, ein Buch, ein Beitrag usw. warum wir sogar so weit kommen können zu sagen, dass diesFirstOrDefault()
ein Codegeruch ist, nicht weil etwas nicht stimmt, sondern weil es viel zu oft verwendet wird. Dieser Blog-Beitrag befasst sich ausführlich mit dem Thema. IMO meistensSingleOrDefault()
ist eine viel bessere Alternative. Achten Sie also auf diesen Fehler und stellen Sie sicher, dass Sie die am besten geeignete Methode verwenden, die Ihren Vertrag und Ihre Erwartungen klar darstellt.quelle
Es gibt viele Möglichkeiten, einzelne einfache Abfragen für Sammlungen zu implementieren. Wir schreiben nur Joins in SQL. Je nach Bedarf und Notwendigkeit kann zuerst oder zuletzt ein Filter angewendet werden.
Hier ist ein Beispiel, in dem wir ein Element mit einer ID in einer Sammlung finden können. Um mehr dazu hinzuzufügen
FirstOrDefault
, würden Methoden First idealerweise dasselbe zurückgeben, wenn eine Sammlung mindestens einen Datensatz enthält. Wenn eine Sammlung jedoch in Ordnung ist, leer zu sein. DannFirst
wird eine Ausnahme zurückgegeben, aberFirstOrDefault
zurückgegebennull
oder standardmäßig. Zum Beispielint
wird 0 zurückgegeben. Daher wird die Verwendung solcher zwar als persönliche Präferenz bezeichnet, aber es ist besser, sie zu verwendenFirstOrDefault
, um die Behandlung von Ausnahmen zu vermeiden.quelle