나는 당신이 사용 .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 (참조 유형) 또는 값 유형의 기본값을 반환합니다. (예를 들어 0
int 와 같습니다 .) 여기서 질문은 기본 유형을 원할 때가 아니라 더 많은 것입니다. 예외를 처리하거나 기본값을 처리 하시겠습니까? 예외는 예외적이어야하므로FirstOrDefault
쿼리에서 결과를 얻을지 확실하지 않을 때 선호됩니다. 논리적으로 데이터가 있어야하는 경우 예외 처리를 고려할 수 있습니다.
Skip()
과 Take()
결과에 페이징을 설정할 때 일반적으로 사용된다. (처음 10 개의 결과를 표시하고 다음 페이지에 다음 10을 표시하는 것처럼)
도움이 되었기를 바랍니다.
답변
.First()
반환 할 행이 없으면 예외가 발생하지만 대신 모든 참조 유형 .FirstOrDefault()
의 기본값이 반환 NULL
됩니다.
따라서 준비하고 가능한 예외를 기꺼이 처리하려는 경우 .First()
괜찮습니다. != null
어쨌든 반환 값을 확인하려면.FirstOrDefault()
더 나은 선택입니다.
그러나 나는 그것이 개인적인 취향이기도합니다. 자신에게 더 적합한 방법을 사용하고 코딩 스타일에 더 잘 맞는 것을 사용하십시오.
답변
먼저()
- 시퀀스의 첫 번째 요소를 반환합니다.
- 결과에 요소가 없거나 소스가 널인 경우 오류가 발생합니다.
- 하나 이상의 요소가 예상되고 첫 번째 요소 만 원하는 경우이를 사용해야합니다.
FirstOrDefault ()
- 시퀀스의 첫 번째 요소 또는 요소가없는 경우 기본값을 리턴합니다.
- 소스가 null 인 경우에만 오류가 발생합니다.
- 하나 이상의 요소가 예상되고 첫 번째 요소 만 원하는 경우이를 사용해야합니다. 결과가 비어있는 경우에도 좋습니다.
UserInfos 테이블이 있는데, 아래와 같이 몇 가지 레코드가 있습니다. 아래 표를 기반으로 예제를 만들었습니다.
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));
}