[C#] .First를 사용하는시기와 LINQ와 함께 .FirstOrDefault를 사용하는시기?

나는 당신이 사용 .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);


답변

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

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

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


답변

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

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

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


답변

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

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

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


답변

먼저()

  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().


답변

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

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

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


답변

먼저:

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

FirstOrDefault :

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

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


답변

주의해야 할 또 다른 차이점은 프로덕션 환경에서 애플리케이션을 디버깅하는 경우 행 번호에 액세스 할 수 없으므로 .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));
}