Kiedy używać.Pierwszy i kiedy używać.Najpierw LINQ?

Szukałem i nie znalazłem jasnej odpowiedzi, kiedy chcesz użyć .First i kiedy chcesz użyć .FirstOrDefault z LINQ.

  • Kiedy chcesz użyć .First? Tylko wtedy, gdy chcesz złapać wyjątek, jeśli nie ma wyników, gdzie wrócił?

    var result = List.Where(x => x == "foo").First();
    
  • A kiedy chcesz użyć .FirstOrDefault? Kiedy zawsze chcesz domyślny typ, jeśli nie ma wyniku?

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • A co z Wziąć?

    var result = List.Where(x => x == "foo").Take(1);
    
 693
Author: BoltClock, 2009-06-21

14 answers

Użyłbym First(), gdy wiem lub oczekuję, że sekwencja będzie miała przynajmniej jeden element. Innymi słowy, gdy jest zjawiskiem wyjątkowym, że sekwencja jest pusta.

Użyj FirstOrDefault(), gdy wiesz, że będziesz musiał sprawdzić, czy był element, czy nie. Innymi słowy, gdy jest legalne, aby Sekwencja była pusta. Nie należy polegać na obsłudze WYJĄTKÓW przy sprawdzaniu. (Jest to zła praktyka i może zaszkodzić wydajności).

Wreszcie różnica między First() a Take() czy First() zwraca sam element, podczas gdy Take() zwraca ciąg elementów, który zawiera dokładnie jeden element. (Jeśli podasz 1 jako parametr).

 698
Author: driis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-07 08:52:38

.First rzuci wyjątek, gdy nie ma wyników. .FirstOrDefault nie zwróci, po prostu zwróci albo null (typy referencyjne) albo domyślną wartość typu value. (np. like 0 for an int.) Tu nie chodzi o to, kiedy chcesz Typ domyślny, ale więcej: Czy chcesz obsłużyć wyjątek lub obsłużyć wartość domyślną? Ponieważ wyjątki powinny być wyjątkowe, FirstOrDefault jest preferowane, gdy nie masz pewności, czy uzyskasz wyniki z zapytania. Gdy logicznie dane powinny być tam można rozważyć obsługę wyjątków.

Skip() i Take() są zwykle używane podczas ustawiania stronicowania w wynikach. (Jak pokazanie pierwszych 10 wyników, i następnych 10 na następnej stronie, itp.)

Mam nadzieję, że to pomoże.
 234
Author: Jeroen Landheer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-21 15:20:37

.First() rzuci wyjątek, jeśli nie ma wiersza do zwrócenia, while .FirstOrDefault () zwróci wartość domyślną (NULL dla wszystkich typów referencji).

Więc jeśli jesteś przygotowany i gotów zająć się ewentualnym wyjątkiem, .First() jest w porządku. Jeśli wolisz sprawdzić wartość zwrotu != null w każdym razie, to .FirstOrDefault() jest Twoim lepszym wyborem. Ale myślę, że to też trochę osobiste preferencje. Użyj tego, co ma dla Ciebie większy sens i lepiej pasuje do Twojego stylu kodowania.
 93
Author: marc_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-10 09:00:33

Pierwszy()

  1. zwraca pierwszy element sekwencji.
  2. wyrzuca błąd, gdy w wyniku nie ma elementu lub źródło jest null.
  3. powinieneś go użyć, jeśli spodziewany jest więcej niż jeden element i chcesz tylko pierwszy element.

FirstOrDefault()

  1. zwraca pierwszy element sekwencji lub wartość domyślną, jeśli żaden element nie został znaleziony.
  2. wyrzuca błąd tylko wtedy, gdy źródło jest null.
  3. powinieneś go użyć, jeśli spodziewany jest więcej niż jeden element i chcesz tylko pierwszy element. Również dobre, jeśli wynik jest pusty.

Mamy tabelę UserInfos, która zawiera kilka rekordów, jak pokazano poniżej. Na podstawie poniższej tabeli stworzyłem przykład...

Tabela UserInfo

Jak używać Najpierw()

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

Jest tylko jeden rekord, w którym ID= = 1. Należy zwrócić ten rekord
ID: 1 imię: Manish nazwisko: Dubey Email: [email protected]

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

Istnieje wiele rekordów, w których FName = = "Rahul". Pierwsza płyta powinna być zwrócona.
ID: 7 imię: Rahul nazwisko: Sharma Email: [email protected]

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

Nie ma rekordu o ID = = 13. Powinien wystąpić błąd.
InvalidOperationException: Sekwencja nie zawiera elementów

Jak korzystać z FirstOrDefault()

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

Jest tylko jeden rekord, w którym ID= = 1. Należy zwrócić ten rekord
ID: 1 imię: Manish nazwisko: Dubey Email: [email protected]

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

Istnieje wiele rekordów, w których FName = = "Rahul". Pierwsza płyta powinna być zwrócona.
ID: 7 imię: Rahul nazwisko: Sharma Email: [email protected]

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

Nie ma rekordu o ID = = 13. Zwracana wartość to null

Mam nadzieję, że pomoże Ci zrozumieć, kiedy używać First() lub FirstOrDefault().

 58
Author: Mukesh Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-26 12:45:16

Po pierwsze, Take to zupełnie inna metoda. Zwraca IEnumerable<T>, a nie pojedynczy T, więc to wychodzi.

Pomiędzy First i FirstOrDefault, powinieneś używać First, Gdy jesteś pewien, że element istnieje, a jeśli nie, to występuje błąd.

Nawiasem mówiąc, jeśli twoja sekwencja zawiera default(T) elementy (np. null) i musisz rozróżnić, że jest pusta, a pierwszym elementem jest null, nie możesz użyć FirstOrDefault.

 17
Author: Mehrdad Afshari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-21 19:23:55

Pierwszy:

  • zwraca pierwszy element sekwencji
  • wyjątek rzuca: w wyniku nie ma żadnych elementów
  • Użyj gdy: gdy oczekuje się więcej niż 1 elementu i chcesz tylko pierwszy

Pierwszy:

  • zwraca pierwszy element sekwencji lub wartość domyślną, jeśli żaden element nie został znaleziony
  • rzuca wyjątek: tylko wtedy, gdy źródłem jest null
  • Użyj gdy: gdy oczekuje się więcej niż 1 elementu i chcesz tylko pierwszy. Również jest ok, aby wynik był pusty

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

 13
Author: user2051770,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-04 14:29:46

Kolejną różnicą jest to, że jeśli debugujesz aplikację w środowisku produkcyjnym, możesz nie mieć dostępu do numerów linii, więc określenie, które konkretne polecenie .First() w metodzie rzuciła wyjątek może być trudne.

Komunikat wyjątku nie będzie również zawierał żadnych wyrażeń Lambda, które mogły być użyte, co sprawiłoby, że każdy problem byłby trudniejszy do debugowania.

Dlatego zawsze używam FirstOrDefault() Chociaż wiem, że wpis null stanowiłby wyjątkowa sytuacja.

var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
if (customer == null)
{
   throw new Exception(string.Format("Can't find customer {0}.", customerId));
}
 6
Author: Kye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-17 00:57:54

Znalazłem stronę, która wyjaśnia potrzebę FirstOrDefault
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
Jeśli nie ma wyników dla zapytania i chcesz wywołać First () lub Single (), aby uzyskać pojedynczy wiersz... Otrzymasz wyjątek "Sekwencja nie zawiera elementów".

Disclaimer: nigdy nie używałem LINQ, więc przepraszam, jeśli to jest daleko od celu.

 3
Author: NULL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-21 19:24:55

Pierwszy()

Gdy wiesz, że wynik zawiera więcej niż 1 element oczekiwany i powinieneś tylko pierwszy element sekwencji.

FirstOrDefault()

FirstOrDefault() jest tak samo jak First() z tym wyjątkiem, że jeśli żaden element nie pasuje do podanego warunku, to zwraca domyślną wartość bazowego typu kolekcji generycznej. Nie wyrzuca InvalidOperationException, jeśli żaden element nie został znaleziony. Ale zbiór elementu Lub ciągu jest null niż rzuca wyjątek.

 3
Author: Nimesh khatri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-21 10:40:00
someList.First(); // exception if collection is empty.
someList.FirstOrDefault(); // first item or default(Type)

Którego użyć? O tym powinna decydować logika biznesowa, a nie strach przed awarią wyjątku/programu.

Na przykład, Jeśli logika biznesowa mówi, że nie możemy mieć zero transakcji w dowolnym dniu roboczym (wystarczy założyć). Następnie nie powinieneś próbować obsługiwać tego scenariusza za pomocą inteligentnego programowania. Zawsze będę używał First () nad taką kolekcją i niech program zawiedzie, jeśli coś innego zepsuło logikę biznesową.

Kod:

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

Chciałbym zobacz inne komentarze na ten temat.

 2
Author: Manish Basantani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-21 22:25:08

Ok, daj mi moje dwa centy. First / Firstordefault są używane, gdy używasz drugiego konstruktora. Nie będę wyjaśniał, co to jest, ale to wtedy potencjalnie zawsze używasz jednego, ponieważ nie chcesz powodować wyjątku.

person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
{
    return string.IsNullOrEmpty(p.Relationship);
}));
 1
Author: Arian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-03 22:02:40

Ten typ funkcji należy do operatorów elementów. Niektóre użyteczne operatory elementów są zdefiniowane poniżej.

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

Używamy operatorów elementów, gdy musimy wybrać pojedynczy element z sekwencji opartej na określonym warunku. Oto przykład.

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

Operator First () zwraca pierwszy element sekwencji po spełnieniu warunku. Jeśli nie znaleziono żadnego elementu wtedy rzuci wyjątek.

Int result = items.Where(item => item == 2).First ();

Operator FirstOrDefault() zwraca pierwszy element sekwencji po spełnieniu warunku. Jeśli żaden element nie zostanie znaleziony, zwróci domyślną wartość tego typu.

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

 0
Author: Sheo Dayal Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-29 05:06:32
 -3
Author: Mou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-06 18:45:51

Linq wiele sposobów na zaimplementowanie pojedynczego prostego zapytania na kolekcjach, po prostu piszemy łącza w sql, filtr może być zastosowany jako pierwszy lub ostatni w zależności od potrzeby i konieczności.

Oto przykład, w którym możemy znaleźć element o id w kolekcji. Aby dodać więcej na ten temat, metody najpierw, FirstOrDefault, najlepiej zwracają to samo, gdy kolekcja ma co najmniej jeden rekord. Jeśli jednak zbiór jest w porządku, aby był pusty. następnie First zwróci wyjątek, ale FirstOrDefault zwróci null lub domyślnie. Na przykład, int zwróci 0. Tak więc używanie takich jest choć mówi się o osobistych preferencjach, ale lepiej jest użyć FirstOrDefault, aby uniknąć obsługi wyjątków. oto przykład, w którym uruchamiamy kolekcję transactionlist

 -8
Author: venkat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-24 15:03:28