Szukałem dookoła i tak naprawdę nie znalazłem jasnej odpowiedzi na pytanie, kiedy chcesz używać .First
i kiedy chcesz korzystać .FirstOrDefault
z LINQ.
Kiedy chcesz użyć
.First
? Tylko kiedy chcesz złapać wyjątek, jeśli nie zwrócono żadnych wyników?var result = List.Where(x => x == "foo").First();
A kiedy chcesz użyć
.FirstOrDefault
? Kiedy zawsze chcesz mieć domyślny typ, jeśli nie ma rezultatu?var result = List.Where(x => x == "foo").FirstOrDefault();
A jeśli o to chodzi, co z Take?
var result = List.Where(x => x == "foo").Take(1);
.First
i.FirstOrDefault
oba przyjmują predykaty jako argumenty, więcvar result = List.Where(x => x == "foo").First();
można je przepisać jakovar result = List.First(x => x == "foo");
Single
iSingleOrDefault
. Nienawidzę, kiedy ludzie używają,First
kiedy naprawdę mają na myśliSingle
; ).FirstOrDefault()
zawsze daje możliwość rzucenia bardziej znaczącego wyjątku. Jeśli zgłoszony zostanie wyjątek sekwencji i więcej niż jeden.First()
w metodzie, może być trudno rozpoznać, która instrukcja jest problemem.Odpowiedzi:
Użyłbym,
First()
gdy wiem lub oczekuję, że sekwencja będzie miała co najmniej jeden element. Innymi słowy, gdy jest wyjątkowym zjawiskiem, 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 w przypadku czeku. (Jest to zła praktyka i może zaszkodzić wydajności).Na koniec różnica między
First()
iTake(1)
polega na tym, żeFirst()
zwraca sam element, podczas gdyTake(1)
zwraca sekwencję elementów, która zawiera dokładnie jeden element.źródło
.First
zgłosi wyjątek, gdy nie ma żadnych wyników..FirstOrDefault
nie, po prostu zwróci null (typy referencyjne) lub domyślną wartość typu wartości. (np. jak0
w przypadku int.) Pytanie nie dotyczy tego, kiedy chcesz typ domyślny, ale więcej: Czy chcesz obsłużyć wyjątek lub wartość domyślną? Ponieważ wyjątki powinny być wyjątkowe,FirstOrDefault
jest preferowane, gdy nie masz pewności, czy chcesz uzyskać wyniki z zapytania. Gdy logicznie dane powinny tam być, można rozważyć obsługę wyjątków.Skip()
iTake()
są zwykle używane podczas konfigurowania stronicowania wyników. (Jak pokazywanie pierwszych 10 wyników, a następnych 10 na następnej stronie itp.)Mam nadzieję że to pomoże.
źródło
.FirstOrDefault
które zwróci null dla typów referencyjnych. Byłem zdezorientowany co do tego, czym byłby „domyślny” obiekt. Ta odpowiedź to wyjaśniła..First()
wyrzuci wyjątek, jeśli nie ma zwracanego wiersza, a zamiast tego.FirstOrDefault()
zwróci wartość domyślną (NULL
dla wszystkich typów referencji).Więc jeśli jesteś przygotowany i chcesz poradzić sobie z możliwym wyjątkiem,
.First()
jest w porządku. Jeśli!= null
mimo to wolisz sprawdzić wartość zwracaną , to.FirstOrDefault()
jest lepszy wybór.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.
źródło
Pierwszy()
FirstOrDefault ()
Mamy tabelę UserInfos, która zawiera niektóre rekordy, jak pokazano poniżej. Na podstawie poniższej tabeli stworzyłem przykład ...
Jak korzystać z First ()
Jest tylko jeden rekord, w którym identyfikator == 1. Powinien zwrócić ten rekord
ID: 1 Imię: Manish Nazwisko: Dubey E-mail: [email protected]
Istnieje wiele rekordów, w których FName == „Rahul”. Pierwszy rekord powinien zostać zwrócony.
ID: 7 Imię: Rahul Nazwisko: Sharma E-mail: [email protected]
Brak rekordu o identyfikatorze == 13. Powinien wystąpić błąd.
InvalidOperationException: Sequence nie zawiera elementów
Jak korzystać z FirstOrDefault ()
Jest tylko jeden rekord, w którym identyfikator == 1. Powinien zwrócić ten rekord
ID: 1 Imię: Manish Nazwisko: Dubey E-mail: [email protected]
Istnieje wiele rekordów, w których FName == „Rahul”. Pierwszy rekord powinien zostać zwrócony.
ID: 7 Imię: Rahul Nazwisko: Sharma E-mail: [email protected]
Brak rekordu o identyfikatorze == 13. Zwracana wartość to null
Mam nadzieję, że pomoże ci to zrozumieć, kiedy użyć
First()
lubFirstOrDefault()
.źródło
Przede wszystkim
Take
jest to zupełnie inna metoda. ZwracaIEnumerable<T>
ani jednegoT
, więc nie ma.Pomiędzy
First
iFirstOrDefault
powinieneś użyć,First
gdy masz pewność, że element istnieje, a jeśli nie, oznacza to błąd.Nawiasem mówiąc, jeśli twoja sekwencja zawiera
default(T)
elementy (np.null
) I musisz odróżnić bycie pustym od pierwszego elementunull
, nie możesz użyćFirstOrDefault
.źródło
Pierwszy:
FirstOrDefault:
Od: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
źródło
Inną różnicą, na którą należy zwrócić uwagę, 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óra konkretna
.First()
instrukcja w metodzie spowodowała wyjątek, może być trudna.Komunikat o wyjątku nie będzie również zawierał żadnych wyrażeń Lambda, które mogłyby spowodować, że problem będzie trudniejszy do debugowania.
Dlatego zawsze używam,
FirstOrDefault()
chociaż wiem, że zerowy wpis stanowiłby wyjątkową sytuację.źródło
Pierwszy()
Gdy wiesz, że wynik zawiera więcej niż 1 oczekiwany element 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 określonego warunku, zwraca domyślną wartość podstawowego typu kolekcji ogólnej. Nie zgłasza InvalidOperationException, jeśli nie znaleziono elementu. Ale zbiór elementu lub sekwencji jest zerowy, niż powoduje wyjątek.
źródło
Ten typ funkcji należy do operatorów elementów. Niektóre przydatne operatory elementów są zdefiniowane poniżej.
Używamy operatorów elementów, gdy musimy wybrać pojedynczy element z sekwencji na podstawie określonego warunku. Oto przykład.
Operator First () zwraca pierwszy element sekwencji po spełnieniu warunku. Jeśli żaden element nie zostanie znaleziony, wygeneruje wyjątek.
wynik int = items.Where (item => item == 2) .First ();
Operator FirstOrDefault () zwraca pierwszy element sekwencji po spełnieniu warunku. Jeśli nie zostanie znaleziony żaden element, zwróci domyślną wartość tego typu.
int wynik1 = items.Where (item => item == 2) .FirstOrDefault ();
źródło
Znalazłem stronę internetową, która pojawia się, aby wyjaśnić potrzebę FirstOrDefault
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
Jeśli nie ma wyników zapytania, i chcesz zadzwonić w pierwszej kolejności () lub Single (), aby uzyskać pojedynczy wiersz ... Otrzymasz wyjątek „Sekwencja nie zawiera elementów”.
Oświadczenie: Nigdy nie korzystałem z LINQ, więc przepraszam, jeśli jest to zupełnie nie na miejscu.
źródło
Którego użyć? Powinno to zależeć od logiki biznesowej, a nie lęku przed wyjątkiem / niepowodzeniem programu.
Na przykład jeśli logika biznesowa mówi, że nie możemy mieć zerowych transakcji w żadnym dniu roboczym (Załóżmy). Wtedy nie powinieneś próbować obsługiwać tego scenariusza za pomocą inteligentnego programowania. Zawsze będę używał First () nad taką kolekcją i pozwolę programowi zawieść, jeśli coś innego popsuło logikę biznesową.
Kod:
Chciałbym zobaczyć komentarze innych na ten temat.
źródło
Ok, daj mi dwa centy. Pierwszy / pierwszy błąd występuje, gdy używasz drugiego konstruktora. Nie wyjaśnię, co to jest, ale wtedy potencjalnie zawsze używałbyś jednego, ponieważ nie chcesz powodować wyjątku.
źródło
Inni bardzo dobrze opisali różnicę między
First()
iFirstOrDefault()
. Chcę zrobić kolejny krok w interpretacji semantyki tych metod. Moim zdaniemFirstOrDefault
jest często nadużywany. W większości przypadków, gdy filtrujesz dane, możesz oczekiwać odzyskania kolekcji elementów pasujących do warunku logicznego lub pojedynczego unikalnego elementu poprzez jego unikalny identyfikator - taki jak użytkownik, książka, post itp. dlaczego możemy nawet powiedzieć, żeFirstOrDefault()
jest to zapach kodu, nie dlatego, że coś jest z nim nie tak, ale dlatego, że jest używany zbyt często. Ten post na blogu szczegółowo omawia ten temat. IMO przez większość czasuSingleOrDefault()
jest znacznie lepszą alternatywą, więc uważaj na ten błąd i upewnij się, że używasz najbardziej odpowiedniej metody, która jasno odzwierciedla twoją umowę i oczekiwania.źródło
linq wiele sposobów na implementację pojedynczego prostego zapytania do kolekcji, po prostu piszemy sprzężenia w sql, filtr może być zastosowany pierwszy lub ostatni w zależności od potrzeb i konieczności.
Oto przykład, w którym możemy znaleźć element z identyfikatorem w kolekcji. Aby dodać więcej na ten temat, metody First,
FirstOrDefault
idealnie zwróciłyby to samo, gdy kolekcja ma co najmniej jeden rekord. Jeśli jednak kolekcja może być pusta. następnieFirst
powróci wyjątek aleFirstOrDefault
powrócinull
lub domyślna. Na przykładint
zwróci 0. Tak więc korzystanie z takich jest, chociaż mówi się, że jest osobistą preferencją, ale lepiej jest użyć,FirstOrDefault
aby uniknąć obsługi wyjątków.źródło