.First를 사용하는시기와 LINQ와 함께 .FirstOrDefault를 사용하는시기?


824

나는 당신이 사용 .First하고 싶을 때 .FirstOrDefault와 LINQ와 함께 사용하고 싶을 때에 대한 명확한 답을 찾지 못했습니다 .

  • 언제 사용하고 싶 .First습니까? 결과가 반환되지 않은 경우 예외를 잡으려는 경우에만?

    var result = List.Where(x => x == "foo").First();
  • 언제 사용하고 싶 .FirstOrDefault습니까? 결과가 없으면 항상 기본 유형을 원할 때?

    var result = List.Where(x => x == "foo").FirstOrDefault();
  • 그리고 그 문제에 대해 테이크는 어떻습니까?

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

86
.First.FirstOrDefault인수로 모두 걸릴 술어는, 그래서 var result = List.Where(x => x == "foo").First();같이 다시 작성할 수 있습니다var result = List.First(x => x == "foo");
리안 Schmits

59
고려하는 것을 잊지 마십시오 SingleSingleOrDefault. 나는 사람들이 First정말로 의미 할 때 사용하는 것을 싫어 한다 Single; )
BartoszKP

19
반환 된 요소가 두 개 이상인 경우 Single 또는 SingleOrDefault에서 예외가 발생합니다. 가장 일반적인 경우에는 FirstOrDefault가 더 좋습니다!
Eric Draven

21
요점은 단일 결과를 기대해야 할 때이며, 예외는 논리가 실패했음을 나타냅니다.
NetMage

1
또한 .FirstOrDefault()항상 사용하면 더 의미있는 예외를 던질 수있는 기회가 주어집니다. 시퀀스 예외가 발생하고 .First()메소드에서 둘 이상이 발생 하면 어떤 명령문이 문제인지 식별하기가 어려울 수 있습니다.
StingyJack

답변:


807

First()시퀀스에 하나 이상의 요소가 있음을 알고 있거나 기대할 때 사용 합니다. 즉, 예외가 발생하면 시퀀스가 ​​비어 있습니다.

FirstOrDefault()요소가 있는지 여부를 확인해야 할 경우 사용하십시오 . 즉, 시퀀스가 ​​비어있는 것이 합법적 일 때. 점검을 위해 예외 처리에 의존해서는 안됩니다. (실용적이지 않으며 성능이 저하 될 수 있습니다).

마지막으로, 차이 First()Take(1)First()복귀하면서 소자 자체가 Take(1)정확히 하나 개의 원소를 함유 원소의 복귀 시퀀스.


4
@driis-First와 FirstOrDefault 중에서 선택할 때 예외 예외 지침의 만트라를 사용할 수 있다고 생각합니다. 명확한 답변 주셔서 감사합니다.
Metro Smurf 2016 년

5
내가 추가 할 유일한 것은 선택한 유형의 기본값이 유효한 값 일 수 있다면 예를 들어 결과가 int 값 0 일 수 있으며 예외를 처리하는 것이 이것을 처리하는 가장 좋은 방법 인 것입니다 .
PeterBelm

25
스크래치, 나는 그것을 달성하는 훨씬 더 좋은 방법을 찾았습니다. 다음을 사용하십시오. DefaultIfEmpty (-1)
.First

5
Take는 정확히 하나의 요소를 반환하지 않으며 최대 하나의 요소를 반환합니다 (물론 1을 지정하는 경우). 시퀀스가 처음 비어 있으면 0 개의 요소를 반환 할 수도 있습니다.
SPIRiT_1984

3
@RoyiNamir, 예 매개 변수가 1 인 질문의 맥락에서 그렇습니다. 나는 또한 그 문장 직후에 Parens로 언급했습니다.
driis

272

.First결과가 없으면 예외가 발생합니다. .FirstOrDefault그렇지 않으면 단순히 null (참조 유형) 또는 값 유형의 기본값을 반환합니다. (예를 들어 0int 와 같습니다 .) 여기서 질문은 기본 유형을 원할 때가 아니라 더 많은 것입니다. 예외를 처리하거나 기본값을 처리 하시겠습니까? 예외는 예외적이어야하므로FirstOrDefault 쿼리에서 결과를 얻을지 확실하지 않을 때 선호됩니다. 논리적으로 데이터가 있어야하는 경우 예외 처리를 고려할 수 있습니다.

Skip()Take() 결과에 페이징을 설정할 때 일반적으로 사용된다. (처음 10 개의 결과를 표시하고 다음 페이지에 다음 10을 표시하는 것처럼)

도움이 되었기를 바랍니다.


5
@Jeroen-Skip / Take를 사용하는 더 나은 사용 사례에 대한 좋은 지적.
Metro Smurf 2016 년

4
.FirstOrDefault참조 유형에 대해 널을 리턴 하는 설명은 +1입니다 . "기본"객체가 무엇인지 혼동했습니다. 이 대답은 그것을 정리했습니다.
Mike Taverne

115

.First()반환 할 행이 없으면 예외가 발생하지만 대신 모든 참조 유형 .FirstOrDefault()의 기본값이 반환 NULL됩니다.

따라서 준비하고 가능한 예외를 기꺼이 처리하려는 경우 .First()괜찮습니다. != null어쨌든 반환 값을 확인하려면.FirstOrDefault() 더 나은 선택입니다.

그러나 나는 그것이 개인적인 취향이기도합니다. 자신에게 더 적합한 방법을 사용하고 코딩 스타일에 더 잘 맞는 것을 사용하십시오.


66

먼저()

  1. 시퀀스의 첫 번째 요소를 반환합니다.
  2. 결과에 요소가 없거나 소스가 널인 경우 오류가 발생합니다.
  3. 하나 이상의 요소가 예상되고 첫 번째 요소 만 원하는 경우이를 사용해야합니다.

FirstOrDefault ()

  1. 시퀀스의 첫 번째 요소 또는 요소가없는 경우 기본값을 리턴합니다.
  2. 소스가 null 인 경우에만 오류가 발생합니다.
  3. 하나 이상의 요소가 예상되고 첫 번째 요소 만 원하는 경우이를 사용해야합니다. 결과가 비어있는 경우에도 좋습니다.

UserInfos 테이블이 있는데, 아래와 같이 몇 가지 레코드가 있습니다. 아래 표를 기반으로 예제를 만들었습니다.

UserInfo 테이블

First ()를 사용하는 방법

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

ID == 1 인 레코드는 하나뿐입니다.이 레코드를 반환해야합니다
. 1 이름 : Manish 성 : Dubey 이메일 : xyz@xyz.com

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

FName == "Rahul"인 레코드가 여러 개 있습니다. 첫 번째 기록을 반환해야합니다.
아이디 : 7 이름 : Rahul 성 : Sharma 이메일 : xyz1@xyz.com

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

ID == 13 인 레코드가 없습니다. 오류가 발생해야합니다.
InvalidOperationException : 시퀀스에 요소가 없습니다

FirstOrDefault ()를 사용하는 방법

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

ID == 1 인 레코드는 하나뿐입니다.이 레코드를 반환해야합니다
. 1 이름 : Manish 성 : Dubey 이메일 : xyz@xyz.com

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

FName == "Rahul"인 레코드가 여러 개 있습니다. 첫 번째 기록을 반환해야합니다.
아이디 : 7 이름 : Rahul 성 : Sharma 이메일 : xyz1@xyz.com

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

ID == 13 인 레코드가 없습니다. 반환 값이 null입니다.

그것을 사용할 때 이해하는 데 도움이 될 것입니다 희망 First()이나 FirstOrDefault().


4
제 생각에는 "오류가 발생해야합니다."라는 문구가 있습니다. 세 번째 FirstOrDefault () 예제에서 오해의 소지가 있습니다.
Jannik

안녕하세요, 잘 설명하지만 조인에서 데이터를 가져올 때와 사용 된 외래 키 테이블에 ID가 없을 때 약간 혼란 스럽습니까? 현재 First ()를 사용하고 있지만 답을 읽은 후에는 아무 생각이 없습니다. 도와주세요
Brijesh Mavani

20

우선 Take, 완전히 다른 방법입니다. IEnumerable<T>단일 이 아닌를 반환 T하므로 종료됩니다.

First와 사이 에 요소가 존재하는지 확인하고 존재하지 않는 경우 오류가 발생했을 때 FirstOrDefault사용해야합니다 First.

그건 그렇고, 시퀀스에 default(T)요소 (예 :)가 포함되어 null있고 비어있는 것과 첫 번째 요소를 구별 해야하는 경우을 null사용할 수 없습니다 FirstOrDefault.


2
@Mehrdad-요점, re : .First는 IEnumerable을 반환하고 FirstOrDefault를 사용하지 않을 때를 반환합니다.
Metro Smurf

15

먼저:

  • 시퀀스의 첫 번째 요소를 반환
  • 예외 발생 : 결과에 요소가 없습니다
  • 사용시기 : 둘 이상의 요소가 예상되고 첫 번째 요소 만 원하는 경우

FirstOrDefault :

  • 시퀀스의 첫 번째 요소를 반환하거나 요소가 없으면 기본값을 반환합니다
  • 예외 발생 : 소스가 null 인 경우에만
  • 사용시기 : 둘 이상의 요소가 예상되고 첫 번째 요소 만 원하는 경우. 또한 결과가 비어있는 것은 괜찮습니다.

보낸 사람 : http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/


10

주의해야 할 또 다른 차이점은 프로덕션 환경에서 애플리케이션을 디버깅하는 경우 행 번호에 액세스 할 수 없으므로 .First()메소드에서 특정 명령문을 식별 하여 예외를 발생시키는 것이 어렵다는 것입니다.

예외 메시지에는 문제를 디버그하기 더 어렵게 만드는 Lambda 식도 포함되지 않습니다.

그래서 FirstOrDefault()null 항목이 예외적 인 상황을 구성한다는 것을 알고 있지만 항상 사용하는 이유 입니다.

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

5

먼저()

결과에 예상 한 요소가 두 개 이상 포함되어 있고 시퀀스의 첫 번째 요소 만 있어야한다는 것을 알고있을 때.

FirstOrDefault ()

FirstOrDefault ()는 First ()와 같습니다. 단, 지정된 조건과 일치하는 요소가 없으면 기본 컬렉션의 기본 유형에 대한 기본값을 반환합니다. 요소를 찾지 못하면 InvalidOperationException을 발생시키지 않습니다. 그러나 요소 또는 시퀀스의 컬렉션은 예외를 throw하는 것보다 null입니다.


안녕하세요, 잘 설명하지만 조인에서 데이터를 가져올 때와 사용 된 외래 키 테이블에 ID가 없을 때 약간 혼란 스럽습니까? 현재 First ()를 사용하고 있지만 답을 읽은 후에는 아무 생각이 없습니다. 도와주세요
Brijesh Mavani

4

이 유형의 함수는 요소 연산자에 속합니다. 몇 가지 유용한 요소 연산자가 아래에 정의되어 있습니다.

  1. 첫 번째 / 첫 번째 또는 기본값
  2. 마지막 / 마지막 또는 기본값
  3. 단일 / 단일 또는 기본값

특정 조건에 따라 시퀀스에서 단일 요소를 선택해야 할 때 요소 연산자를 사용합니다. 다음은 예입니다.

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

First () 연산자는 조건을 만족 한 후 시퀀스의 첫 번째 요소를 반환합니다. 요소가 없으면 예외가 발생합니다.

int 결과 = items.Where (항목 => 항목 == 2) .First ();

FirstOrDefault () 연산자는 조건을 만족 한 후 시퀀스의 첫 번째 요소를 반환합니다. 요소가 없으면 해당 유형의 기본값을 리턴합니다.

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


이해하기 쉬운 예제로 잘 설명되어 있습니다.
Arslan Bhatti

3

나는 FirstOrDefault에 대한 필요성 설명 apperars 웹 사이트 발견
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/를
쿼리에 결과가없는 경우, 그리고 당신이 먼저 전화를 할 단일 행을 얻으려면 () 또는 Single () ... "시퀀스에 요소가 없습니다"예외가 발생합니다.

면책 조항 : 나는 LINQ를 사용한 적이 없기 때문에 이것이 잘못 된 경우 사과드립니다.


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

어느 것을 사용해야합니까? 예외 / 프로그램 실패에 대한 두려움이 아니라 비즈니스 논리에 의해 결정되어야합니다.

예를 들어, 비즈니스 로직에 따르면 근무일에 트랜잭션이 0 일 수 없다고 가정합니다 (가정). 그런 다음 일부 스마트 프로그래밍으로이 시나리오를 처리하려고 시도해서는 안됩니다. 나는 항상 그러한 콜렉션에 대해 First ()를 사용하고, 다른 것이 비즈니스 로직을 망쳐 놓으면 프로그램이 실패하게합니다.

암호:

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

나는 이것에 대한 다른 사람들의 의견을보고 싶습니다.


참조 및 널 입력 가능 유형의 기본값은 널입니다.
dsa

빠르게 실패하는 것이 좋습니다. 그러나 설명 된 시나리오의 경우, 먼저 실패하고 예외를 포착 한 다음 의미있는 오류를 리턴하는 것이 좋습니다. catch (InvalidOperationException e) {{new newOperationException ( "하루에 0 개의 트랜잭션을 가질 수 없습니다!", e)}); 그러나 실제 비즈니스 로직 문제를 다루지 않기 위해 기본값을 사용하는 것은 매우 나쁩니다.
Mathieson

1

좋아, 내가 2 센트를 주겠다. First / Firstordefault는 두 번째 생성자를 사용할 때 사용됩니다. 나는 그것이 무엇인지 설명하지는 않지만 예외를 일으키고 싶지 않기 때문에 항상 잠재적으로 사용할 것입니다.

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

정확히. 첫 번째 생성자는 배열이 아닌 값에 결과를 할당 할 때 하나의 항목 만 검색하거나 컴파일 오류를 피해야 할 때 널리 사용되며 쿼리에서 정확히 하나의 결과를 반환해야합니다. 추가 .Where ()를 사용하는 대신 두 번째 생성자를 사용하는 것이 더 빠를 수도 있지만 생각 LINQ는 먼저 찾은 후 목록의 항목을 평가 정지) 항상 첫 번째 요소에서 정지
USR-로컬 ΕΨΗΕΛΩΝ

0

다른 사람은 아주 잘 사이의 차이를 설명했다 First()하고 FirstOrDefault(). 이 메소드의 의미를 해석하는 데있어 한 걸음 더 나아가고 싶습니다. 제 생각 FirstOrDefault에는 많이 남용되고 있습니다. 대부분의 경우 데이터를 필터링하는 경우 논리적 조건과 일치하는 요소 컬렉션이나 고유 식별자 (예 : 사용자, 서적, 게시물 등)로 고유 한 단일 요소를 가져올 수 있습니다. 왜 우리는 FirstOrDefault()코드 냄새가 나쁘다는 것이 아니라 너무 자주 사용되기 때문에 코드 냄새 라고 말할 수 있습니다. 이 블로그 게시물 에서는 주제를 자세히 살펴 봅니다. 대부분의 시간SingleOrDefault() 훨씬 더 나은 대안이므로이 실수를 조심하고 계약과 기대를 명확하게 나타내는 가장 적절한 방법을 사용해야합니다.


-6

linq 컬렉션에서 하나의 간단한 쿼리를 구현하는 여러 가지 방법으로 SQL에 조인을 작성하면 필요와 필요성에 따라 필터를 처음 또는 마지막에 적용 할 수 있습니다.

다음은 컬렉션에서 id를 가진 요소를 찾을 수있는 예입니다. 이것에 더 많은 것을 추가하기 위해, 메소드 First FirstOrDefault는 컬렉션에 레코드가 하나 이상있을 때 이상적으로 동일한 것을 반환합니다. 그러나 컬렉션이 비어 있으면 괜찮습니다. 그런 다음 First예외 FirstOrDefault를 반환 하지만 null기본값 을 반환 합니다. 예를 들어, int0을 리턴합니다. 따라서 이러한 사용법은 개인 취향이라고하지만 FirstOrDefault예외 처리를 피하기 위해 사용 하는 것이 좋습니다 . 다음은 transactionlist 컬렉션을 실행하는 예제입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.