19

가능한 중복 :

.FirstOrDefault를 LINQ와 함께 사용할 때 .First와 언제 사용합니까?

무엇을 사용 하는가?FirstLINQ의 연산자를 사용하면FirstOrDefault연산자 대신?

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


  • 나는 복제물에 대한 닫기를 볼 수 있었지만 ... "건설적이지 않다"고요? :( 그러나, 나는 그 질문이 다음과 같은 설명을 사용할 수 있다고 생각한다. First(Error-if-empty)는 다음보다 덜 이상적이라고 생각됩니다.FirstOrDefault. - user166390

3 답변


17

특정 질문에 직접 응답하려면 (왜 사용합니까?First언제든지 사용할 수 있다면FirstOrDefault), 사용할 수없는 경우가 있습니다.FirstOrDefault, 그것은 정보를 잃기 때문에! "기본값"은 소스 목록의 유효한 요소 유형입니다. 열거 형의 첫 번째 요소를 null / default로 구별 할 수있는 방법과 사용하지 않는 한 목록에 요소가 없도록 구별 할 방법이 없습니다.First또는 처음 있는지 확인하십시오.Any요소. 이중 열거 형이 필요합니다.

특히 value-typed enumerables의 경우에는 특히 그렇습니다.int[].default(int)~이다.0이는 배열의 유효한 값이기도합니다.

일반적으로 두 가지 방법은 서로 다른 논리 흐름을 나타냅니다.First요소가 없으면 "예외적"(오류)하고 응용 프로그램에서 대역 외를 처리하려고 할 때 사용됩니다. 이 시나리오에서는 적어도 하나의 요소가 있어야합니다.FirstOrDefault빈 집합에 null을 반환하므로 반환 값을 사용하여 추가 처리가 필요합니다. 이것은 비슷한 로직입니다.ParseTryParse에 관한 방법들int/double/기타. 사실, 당신의 질문은 어떤면에서 예외를 사용하는 이유에 대한보다 일반적인 질문으로 이어집니다.

이후First예외를 던지면 예외가 제공하는 모든 코드 재사용 기회를 얻을 수 있습니다. 예를 들어 다음과 같이 할 수 있습니다.

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


8

명시 적으로 예외를 발생시키지 않고 예외를 발생 시키려면null검사.


2

그것은 같은 토론이다.Int32.ParseInt32.TryParse. 전자는 실패의 경우 예외를 던지고 후자는 거짓을 반환하고 프로그램은 원활하게 계속됩니다 ...

연결된 질문


관련된 질문

최근 질문