716

나는 주위를 수색 했었고, 당신이 언제 사용하고 싶은지에 관해 명확한 대답을 찾지 못했다..First당신이 사용하고 싶을 때.FirstOrDefaultLINQ.

  • 언제 사용하고 싶습니까?.First? 반환 된 결과가 없으면 예외를 catch하고 싶을 때만?

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

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • 그리고 그 문제에 관해, Take는 어떨까요?

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


  • .First.FirstOrDefault둘 다 술어를 인수로 취하므로var result = List.Where(x => x == "foo").First();다음과 같이 재 작성 될 수있다.var result = List.First(x => x == "foo"); - Rian Schmits
  • 고려하지 마세요.SingleSingleOrDefault. 사람들이 사용할 때 나는 싫어.First그들이 정말로 의미 할 때Single; ) - BartoszKP
  • 둘 이상의 요소가 반환되면 Single 또는 SingleOrDefault가 예외를 throw합니다! FirstOrDefault가 가장 일반적인 경우에 더 좋습니다. - Eric Draven
  • 요점은 단일 결과를 기대한다고 말하면서 예외가 논리가 실패했음을 나타냅니다. - NetMage
  • 전체를 설명하는 훌륭한 기사.donnfelker.com/linq-single-vs-first - Latency

14 답변


715

나는First()시퀀스가 최소한 하나의 요소를 갖고 있다는 것을 알거나 기대할 때. 즉, 시퀀스가 비어있는 예외적 인 경우입니다.

용도FirstOrDefault()요소가 있는지 없는지를 확인할 필요가 있다는 것을 알 때. 다시 말해 시퀀스가 비어있는 것이 합법적 일 때입니다. 수표에 대한 예외 처리에 의존해서는 안됩니다. (그것은 나쁜 습관이고 성능을 해칠 수도 있습니다).

마지막으로,First()Take()그것입니다.First()요소 자체를 반환하고Take()정확히 하나의 요소를 포함하는 요소의 시퀀스를 반환합니다. (매개 변수로 1을 전달하면).


  • @driis - First와 FirstOrDefault 중 하나를 선택할 때 예외 예외 지침의 진언을 사용할 수 있다고 생각합니다. 분명한 대답을 주셔서 감사합니다. - Metro Smurf
  • 내가 추가 할 수있는 유일한 점은 선택하려는 유형의 기본값이 유효한 값일 수 있습니다 (예 : 결과가 int 값 0 일 수 있음). 예외 처리가 가장 좋은 것 같습니다. 이것을 처리하는 방법. - PeterBelm
  • 그것을 달성하기 위해 훨씬 더 좋은 방법을 찾았습니다. DefaultIfEmpty (-1) .First () - PeterBelm
  • Take는 정확히 하나의 요소를 반환하지 않으며, 하나의 요소 만 반환합니다 (물론 1을 지정한 경우). 시퀀스가 처음 비어있는 경우 0 요소를 반환 할 수 있습니다. - SPIRiT_1984
  • @ 로이 나미르, 취할 매개 변수가있는 질문의 맥락에서 그렇습니다. 나는 또한 그 문장 바로 뒤의 괄호 안에 그것을 지적했습니다. - driis

244

.First결과가없는 경우 예외가 throw됩니다..FirstOrDefault그렇지 않으면 단순히 널 (참조 유형) 또는 값 유형의 기본값을 리턴합니다. (예 :0int에 대해) 여기에있는 질문은 기본 유형을 원할 때가 아닙니다. 예외 : 예외를 처리하거나 기본값을 처리 할 의향이 있습니까? 예외는 예외적이어야하기 때문에,FirstOrDefault결과에서 검색어를 가져올 지 확실하지 않은 경우 선호됩니다. 논리적으로 데이터가 있어야 할 때 예외 처리가 고려 될 수 있습니다.

Skip()Take()결과에서 페이징을 설정할 때 일반적으로 사용됩니다. (처음 10 개의 결과를 보여주는 것과 다음 페이지의 다음 10 개를 보여주는 것과 같이)

희망이 도움이됩니다.


  • @ 제로 - Skip / Take를 사용하는 더 나은 유스 케이스에 대한 좋은 지적. - Metro Smurf
  • 설명을 위해 +1.FirstOrDefault참조 형의 경우는 null를 돌려줍니다. 나는 "default"가 무엇인지 혼란스러워했다. 개체가 될 것입니다. 이 대답은 그 점을 분명히했습니다. - Mike Taverne

94

.FirstOrDefault ()가 기본값을 반환하는 동안 .First ()는 반환 될 행이 없으면 예외를 throw합니다.NULL모든 참조 유형에 대해).

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

하지만 개인적인 취향이기도합니다. 어느 쪽이든 당신에게 더 맞는 것을 사용하고 코딩 스타일을 더 잘 맞 춥니 다.


  • 사소한 수정 - FirstOrDefault는 참조 유형에 대해 null을 반환하고 값 유형에 대해 defalt 값을 반환합니다. - Jamie Ide

59

먼저()

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

FirstOrDefault ()

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

우리는 UserInfos 테이블을 가지고 있습니다.이 테이블에는 아래와 같은 레코드가 있습니다. 아래의 표를 기반으로 예제를 만들었습니다 ...

UserInfo Table

First () 사용 방법

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

ID == 1 인 레코드는 하나뿐입니다.이 레코드를 반환해야합니다.

ID : 1 이름 : Manish 성 : Dubey 이메일 : xyz@xyz.com

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

FName == "Rahul"인 여러 레코드가 있습니다. 첫 번째 기록은 반환되어야합니다.

ID : 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 인 레코드는 하나뿐입니다.이 레코드를 반환해야합니다.

ID : 1 이름 : Manish 성 : Dubey 이메일 : xyz@xyz.com

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

FName == "Rahul"인 여러 레코드가 있습니다. 첫 번째 기록은 반환되어야합니다.

ID : 7 이름 : Rahul 성 : Sharma 이메일 : xyz1@xyz.com

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

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

사용시기를 이해하는 데 도움이되기를 바랍니다.First()또는FirstOrDefault().


  • 제 의견으로는 "오류가 발생했습니다."라는 문구가 있습니다. 세 번째 FirstOrDefault () 아래 - 예는 잘못된 것입니다. - Jannik
  • 안녕하세요, 당신은 잘 설명하지만, 나는 조인에서 데이터를 얻을 때와 ID가 외래 키 테이블에 존재하지 않았을 때 약간 혼란 스럽습니다. 현재는 First ()를 사용하고 있지만 답변을 읽은 후에는 전혀 모른다. 도움을 청하십시오. - Brijesh Mavani

18

가장 먼저,Take완전히 다른 방법입니다. 그것은IEnumerable<T>한 명도 아니고T그래서 그게 다야.

중에서FirstFirstOrDefault, 당신은 사용해야합니다First요소가 있다고 확신하고 그렇지 않으면 오류가 발생합니다.

그건 그렇고, 시퀀스에default(T)요소 (예 :null) 그리고 비어있는 것과 첫 번째 요소를 구별해야합니다.null, 당신은 사용할 수 없습니다.FirstOrDefault.


  • @Mehrdad - 위대한 포인트, 다시 : 첫 번째는 IEnumerable을 반환하고 FirstOrDefault를 사용하지 않을 경우를 반환합니다. - Metro Smurf

13

먼저:

  • 시퀀스의 첫 번째 요소를 반환합니다.
  • 예외 예외 : 결과에 요소가 없습니다.
  • 다음과 같은 경우 사용 : 1 개 이상의 요소가 필요하고 첫 번째 요소 만 원할 경우

FirstOrDefault :

  • 시퀀스의 첫 번째 요소를 반환하거나 요소가 없으면 기본값을 반환합니다.
  • 예외 : 예외 : 소스가 null의 경우
  • 다음과 같은 경우 사용 : 요소가 두 개 이상이고 첫 번째 요소 만 원할 때 사용하십시오. 결과가 비어도 괜찮습니다.

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


6

또 다른 차이점은 프로덕션 환경에서 응용 프로그램을 디버깅 할 경우 줄 번호에 액세스 할 수 없으므로 특정 줄.First()예외를 throw하는 메서드에서 문이 어려울 수 있습니다.

예외 메시지에는 문제를 일으킬 수있는 람다식이 포함되어 있지 않으므로 디버그하기가 어렵습니다.

그게 내가 항상 사용하는 이유 야.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));
}


4

먼저()

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

FirstOrDefault ()

FirstOrDefault ()는 지정된 조건과 일치하는 요소가없는 경우 기본 형식의 기본 형식의 기본값을 반환하는 것보다 First ()와 같습니다. 요소가 발견되지 않으면 InvalidOperationException을 throw하지 않습니다. 그러나 요소 또는 시퀀스의 수집은 예외를 throw하는 것보다 null입니다.


  • 안녕하세요, 당신은 잘 설명하지만, 나는 조인에서 데이터를 얻을 때와 ID가 외래 키 테이블에 존재하지 않았을 때 약간 혼란 스럽습니다. 현재는 First ()를 사용하고 있지만 답변을 읽은 후에는 전혀 모른다. 도움을 청하십시오. - Brijesh Mavani

3

AppOars가 FirstOrDefault의 필요성을 설명하는 웹 사이트를 찾았습니다.

http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/

쿼리에 결과가없고 단일 행을 가져 오기 위해 First () 또는 Single ()을 호출하려는 경우 ... "요소에 시퀀스가 없습니다"예외가 발생합니다.

면책 조항 : 저는 LINQ를 사용한 적이 없으므로, 이것이 사과하는 것이 아니라면 사과드립니다.


  • 링크가 더 이상 작동하지 않습니다. - Peroxy

2

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

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

예를 들어, 비즈니스 로직에서 근무일에 아무런 트랜잭션도 가질 수 없다고 말하면 (단지 가정). 그런 다음 스마트 프로그래밍을 통해이 시나리오를 처리하려고해서는 안됩니다. 나는 항상 그러한 컬렉션에 대해 First ()를 사용할 것이고, 다른 것이 비즈니스 로직을 망쳐 버리면 프로그램을 실패하게 만들 것이다.

암호:

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

나는 다른 사람들이 이것에 대해 논평하는 것을보고 싶다.


  • 참조 및 null 가능 유형의 기본값은 null입니다. - dsa
  • 빠르게 실패하는 것이 좋습니다. 그러나 설명하는 시나리오에서 먼저 오류가 발생했는지 확인하고, 실패한 경우 예외를 발견 한 다음 의미있는 오류를 반환합니다. Like (InvalidOperationException e) {In new InvalidOperationException ( "하루에 0 개의 트랜잭션을 가질 수 없습니다!", e)}; 하지만 그래, 실제 비즈니스 로직 문제를 다루지 않도록 기본값을 사용하는 것은 매우 나쁩니다. - Mathieson

1

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

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


  • 정확히. 첫 번째 생성자는 배열이 아닌 값에 결과를 할당 할 때 하나의 항목 만 검색하거나 컴파일 오류를 피할 필요가있을 때 쿼리가 정확히 하나의 결과를 반환 할 때 널리 사용됩니다. 추가 .Where ()를 사용하는 것보다 두 번째 생성자를 사용하는 것이 더 빠를 수도 있지만 (왜냐하면생각한다LINQ는 첫 번째 요소를 찾은 후 목록의 항목 평가를 중지합니다. 첫 번째 요소에서 항상 멈 춥니 다. - usr-local-ΕΨΗΕΛΩΝ

0

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

  1. First / FirstOrDefault
  2. 마지막 / LastOrDefault
  3. Single / SingleOrDefault

특정 조건을 기반으로하는 시퀀스에서 단일 요소를 선택해야 할 때 요소 연산자를 사용합니다. 다음은 그 예입니다.

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

First () 연산자는 조건을 만족시킨 후 시퀀스의 첫 번째 요소를 반환합니다. 요소가 발견되지 않는 경우는 예외가 슬로우됩니다.

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

FirstOrDefault () 연산자는 조건을 만족시킨 후 시퀀스의 첫 번째 요소를 반환합니다. 요소가 발견되지 않으면 해당 유형의 기본값을 반환합니다.

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


-3

이전 게시물에 대한 답변을 게시하는 것에 대해 죄송합니다. 세부 사항 및 좋은 설명은 이렇게 읽힌다 urls를 아래에 읽으십시오http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/

http://www.dotnet-tricks.com/Tutorial/linq/E23I160714-Understanding-Single,-SingleOrDefault,-First-and-FirstOrDefault.html

http://www.c-sharpcorner.com/UploadFile/3d39b4/singleordefault-and-firstordefault-methods-in-linq-to-sql/


  • 앞으로 링크가 망가질 경우를 대비하여 콘텐츠를 요약하는 것이 유용 할 것입니다. 그런 식으로이 대답은 여전히 StackOverflow에 유용 할 것입니다. - Brian J

-8

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

다음은 컬렉션에 id가있는 요소를 찾을 수있는 예제입니다. 이것에 대해 더 자세히 알려면 First Methods,FirstOrDefault컬렉션에 적어도 하나 이상의 레코드가있는 경우 이상적으로 반환합니다. 그러나 컬렉션이 비어 있어도됩니다. 그때First예외를 반환하지만FirstOrDefault돌아올거야.null또는 기본값. 예를 들어,int그런 식의 사용은 개인적 선호라고는하지만, 사용하는 것이 더 낫다.FirstOrDefault예외 처리를 피할 수 있습니다.here is an example where, we run over a collection of transactionlist

연결된 질문


관련된 질문

최근 질문