it-swarm.com.de

Wann soll .First und wann .FirstOrDefault mit LINQ verwendet werden?

Ich habe mich umgesehen und keine klare Antwort gefunden, wann Sie .First und wann Sie .FirstOrDefault mit LINQ verwenden möchten.

  • Wann möchten Sie .First verwenden? 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 .FirstOrDefault verwenden? Wann möchten Sie immer den Standardtyp, wenn kein Ergebnis erzielt wird?

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • Und was ist mit Take?

    var result = List.Where(x => x == "foo").Take(1);
    
780
Metro Smurf

Ich würde First() verwenden, wenn ich weiß oder erwarte, dass die Sequenz mindestens ein Element enthält. Mit anderen Worten, wenn die Sequenz in Ausnahmefällen leer ist.

Verwenden Sie FirstOrDefault(), 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() und Take(1) darin, dass First() das Element selbst zurückgibt, während Take(1) eine Folge von Elementen zurückgibt, die genau ein Element enthält.

769
driis

.First löst eine Ausnahme aus, wenn keine Ergebnisse vorliegen. .FirstOrDefault gibt entweder null (Referenztypen) oder den Standardwert des Werttyps zurück. (z. B. wie 0 für ein Int.) Die Frage hier ist nicht, wann Sie den Standardtyp möchten, sondern mehr: Sind Sie bereit, eine Ausnahme oder einen Standardwert zu behandeln? Da Ausnahmen außergewöhnlich sein sollten, wird FirstOrDefault bevorzugt, wenn Sie nicht sicher sind, ob Ihre Abfrage zu Ergebnissen führen wird. Wenn die Daten logischerweise vorhanden sein sollten, kann die Ausnahmebehandlung in Betracht gezogen werden.

Skip() und Take() 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.

264
Jeroen Landheer

.First() löst eine Ausnahme aus, wenn keine Zeile zurückgegeben werden soll, während .FirstOrDefault() stattdessen den Standardwert (NULL für alle Referenztypen) zurückgibt.

Wenn Sie also bereit und gewillt sind, eine mögliche Ausnahme zu behandeln, ist .First() in Ordnung. Wenn Sie ohnehin den Rückgabewert für != null überprüfen möchten, ist .FirstOrDefault() Ihre bessere Wahl.

Aber ich denke, es ist auch eine persönliche Vorliebe. Verwenden Sie, was für Sie sinnvoller ist und besser zu Ihrem Codierungsstil passt.

111
marc_s

First ()

  1. Gibt das erste Element einer Sequenz zurück.
  2. Es wird ein Fehler ausgegeben, wenn das Ergebnis kein Element enthält oder die Quelle null ist.
  3. sie sollten es verwenden, wenn mehr als ein Element erwartet wird und Sie nur das erste Element möchten.

FirstOrDefault ()

  1. Gibt das erste Element einer Sequenz oder einen Standardwert zurück, wenn kein Element gefunden wird.
  2. Es wird nur dann ein Fehler ausgegeben, wenn die Quelle null ist.
  3. sie sollten es verwenden, wenn mehr als ein Element erwartet wird und Sie nur das erste Element möchten. Auch gut, wenn das Ergebnis leer ist.

Wir haben eine UserInfos-Tabelle, die einige Datensätze enthält, wie unten gezeigt. Anhand dieser Tabelle habe ich ein Beispiel erstellt ...

UserInfo Table

Wie benutzt man First ()

var result = dc.UserInfos.First(x => x.ID == 1);

Es gibt nur einen Datensatz, in dem ID == 1. Sollte diesen Datensatz zurückgeben
ID: 1 Vorname: Manish Nachname: Dubey E-Mail: [email protected]

var result = dc.UserInfos.First(x => x.FName == "Rahul");   

Es gibt mehrere Datensätze, in denen FName == "Rahul" ist. Der erste Datensatz sollte zurückgegeben werden.
ID: 7 Vorname: Rahul Nachname: Sharma E-Mail: [email protected]

var result = dc.UserInfos.First(x => x.ID ==13);

Es gibt keinen Datensatz mit der ID == 13. Es sollte ein Fehler auftreten.
InvalidOperationException: Die Sequenz enthält keine Elemente

Verwendung von FirstOrDefault ()

var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1);

Es gibt nur einen Datensatz, in dem ID == 1. Sollte diesen Datensatz zurückgeben
ID: 1 Vorname: Manish Nachname: Dubey E-Mail: [email protected]

var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul");

Es gibt mehrere Datensätze, in denen FName == "Rahul" ist. Der erste Datensatz sollte zurückgegeben werden.
ID: 7 Vorname: Rahul Nachname: Sharma E-Mail: [email protected]

var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13);

Es gibt keinen Datensatz mit der ID == 13. Der Rückgabewert ist null

Hoffe, es wird Ihnen helfen, zu verstehen, wann Sie First() oder FirstOrDefault() verwenden müssen.

63
Mukesh Kumar

Erstens ist Take eine völlig andere Methode. Es gibt einen IEnumerable<T> und keinen einzelnen T zurück, das ist also out.

Zwischen First und FirstOrDefault sollten Sie First verwenden, wenn Sie sicher sind, dass ein Element vorhanden ist, und wenn dies nicht der Fall ist, liegt ein Fehler vor.

Wenn Ihre Sequenz übrigens default(T) Elemente enthält (z. B. null) und Sie zwischen leer und dem ersten Element null unterscheiden müssen, können Sie FirstOrDefault nicht verwenden.

19
Mehrdad Afshari

Zuerst:

  • Gibt das erste Element einer Sequenz zurück
  • Löst eine Ausnahme aus: Das Ergebnis enthält keine Elemente
  • Verwenden Sie diese Option, wenn mehr als ein Element erwartet wird und Sie nur das erste möchten

FirstOrDefault:

  • Gibt das erste Element einer Sequenz oder einen Standardwert zurück, wenn kein Element gefunden wird
  • Löst eine Ausnahme aus: Nur wenn die Quelle null ist
  • Verwenden Sie diese Option, wenn mehr als ein Element erwartet wird und Sie nur das erste möchten. Auch ist es in Ordnung, wenn das Ergebnis leer ist

Von: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/

13
user2051770

Ein weiterer Unterschied besteht darin, dass Sie beim Debuggen einer Anwendung in einer Produktionsumgebung möglicherweise keinen Zugriff auf Zeilennummern haben. Daher kann es schwierig sein, festzustellen, welche bestimmte .First() -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 das Debuggen von Problemen noch schwieriger wird.

Deshalb verwende ich immer FirstOrDefault(), obwohl ich weiß, dass ein Null-Eintrag eine Ausnahmesituation darstellen würde.

var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
if (customer == null)
{
   throw new Exception(string.Format("Can't find customer {0}.", customerId));
}
9
Kye

First ()

Wenn Sie wissen, dass das Ergebnis mehr als 1 Element enthält, sollten Sie nur das erste Element der Sequenz erwarten.

FirstOrDefault ()

FirstOrDefault () ist genau wie First (), außer dass, wenn kein Element der angegebenen Bedingung entspricht, der Standardwert des zugrunde liegenden Typs der generischen Auflistung zurückgegeben wird. InvalidOperationException wird nicht ausgelöst, wenn kein Element gefunden wird. Die Auflistung eines Elements oder einer Sequenz ist jedoch null, als sie eine Ausnahme auslöst.

4
Nimesh khatri

Ich habe eine Website gefunden, die die Notwendigkeit von FirstOrDefault erklärt
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
Wenn eine Abfrage keine Ergebnisse liefert und Sie First () oder Single () aufrufen möchten, um eine einzelne Zeile abzurufen ... wird die Ausnahme "Sequenz enthält keine Elemente" angezeigt.

Haftungsausschluss: Ich habe noch nie LINQ verwendet. Ich entschuldige mich, wenn dies nicht der Fall ist.

3
NULL

Diese Art der Funktion gehört zu Elementoperatoren. Einige nützliche Elementoperatoren sind unten definiert.

  1. First/FirstOrDefault
  2. Last/LastOrDefault
  3. Single/SingleOrDefault

Wir verwenden Elementoperatoren, wenn wir ein einzelnes Element aus einer Sequenz basierend auf einer bestimmten Bedingung auswählen müssen. Hier ist ein Beispiel.

  List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9, 2, 10 };

Der Operator First () gibt das erste Element einer Sequenz zurück, nachdem die Bedingung erfüllt wurde. Wird kein Element gefunden, 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. Wird kein Element gefunden, wird der Standardwert dieses Typs zurückgegeben.

int result1 = items.Where (item => item == 2) .FirstOrDefault ();

3
someList.First(); // exception if collection is empty.
someList.FirstOrDefault(); // first item or default(Type)

Welches verwenden? Es 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 null Transaktionen haben können (Nehmen Sie einfach an). Dann sollten Sie nicht versuchen, dieses Szenario mit einer intelligenten Programmierung zu bewältigen. Ich werde First () immer über eine solche Sammlung verwenden und das Programm fehlschlagen lassen, wenn etwas anderes die Geschäftslogik durcheinander bringt.

Code:

var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay();
var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault()

Ich würde gerne andere Kommentare dazu sehen.

2

Ok, lass mich meine zwei Cent geben. First/Firstordefault gibt an, wann Sie den zweiten Konstruktor verwenden. 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.

person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
{
    return string.IsNullOrEmpty(p.Relationship);
}));
1
Arian