2011-12-03 4 views
19

가능한 중복 : LINQ에서 FirstOrDefault 대신 First를 사용하는 이유는 무엇입니까?

대신 FirstOrDefault 연산자를 사용할 수있는 경우, LINQ의 First 연산자를 사용하는 점은 무엇입니까
When to use .First and when to use .FirstOrDefault with LINQ?

?

var q = results.First(); // Error if empty 
+2

"중복되지는 않았지만 ..."건설적이지 않습니까? (그러나, 나는 왜 * First * (Error-if-empty 포함)가 FirstOrDefault보다 덜 이상적이라고 생각하는지에 대한 설명을 사용할 수 있다고 생각합니다. –

답변

17

FirstOrDefault을 항상 사용할 수있는 경우 First을 사용해야하는 이유는 무엇입니까? 정보를 잃어 버리기 때문에 FirstOrDefault을 사용할 수 없습니다! "기본값"은 소스 목록의 유효한 요소 유형입니다. First을 사용하거나 Any 요소가 있는지 첫 번째 검사에서 이중 열거 형을 사용해야하는 경우를 제외하고 열거 형의 첫 번째 요소와 null/default가 구별되는 방법은 없습니다.

int[]과 같은 값 유형 열거 형의 경우 특히 그렇습니다. default(int)0이며, 이는 배열의 유효한 값이기도합니다.

일반적으로 두 가지 방법은 서로 다른 논리 흐름을 나타냅니다. First은 요소가 "예외적"(오류)이 아닌 경우에 사용되며 응용 프로그램에서 대역 외를 처리하려고합니다. 이 시나리오에서는 적어도 하나의 요소가 있어야합니다. FirstOrDefault은 빈 집합에 null을 반환하므로 반환 값을 사용하여 추가 처리가 필요합니다. 이것은/double/등의 대 TryParse 방법과 유사한 논리입니다. 사실, 당신의 질문은 어떤면에서 예외를 사용하는 이유에 대한보다 일반적인 질문으로 이어집니다.

First은 예외를 throw하므로 예외가 제공하는 모든 코드 재사용 기회를 얻을 수 있습니다. 예를 들어, 다음과 같이 할 수 있습니다.

try 
{ 
    x = arr1.First(); 
    y = arr2.First(); 
    z = arr3.First(); 
} 
catch 
{ 
    throw new ArgumentException(); 
} 
8

명시 적으로 예외를 강제하기는 null 검사를 수행 비해 제기하세요.

2

Int32.ParseInt32.TryParse과 같은 논의입니다. 전자가 실패 할 경우 예외가 발생하고 후자는 거짓을 반환하고 프로그램이 원활하게 진행됩니다 ...

관련 문제