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);
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).
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.)
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).
.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.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()
- zwraca pierwszy element sekwencji.
- wyrzuca błąd, gdy w wyniku nie ma elementu lub źródło jest null.
- powinieneś go użyć, jeśli spodziewany jest więcej niż jeden element i chcesz tylko pierwszy element.
FirstOrDefault()
- zwraca pierwszy element sekwencji lub wartość domyślną, jeśli żaden element nie został znaleziony.
- wyrzuca błąd tylko wtedy, gdy źródło jest null.
- 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...
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()
.
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
.
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/
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));
}
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.
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.
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.
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);
}));
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.
- First / FirstOrDefault
- Last / LastOrDefault
- 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 ();
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
Przepraszam za zamieszczenie odpowiedzi na stary post. szczegóły i dobre wyjaśnienie, więc proszę przeczytać poniżej adresy URL http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
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.
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