[43] 쿼리 결과의 의미를 명확히 강제하고, Single()과 First()를 사용하라

다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다.

 

1. Single

1-1) Single

LINQ에서 SIngle()은 정확히 1개의 요소만 반환한다.

만약 어떤 요소도 포함되지 않거나 여러 개의 요소가 포함되는 경우 Single()은 예외를 유발한다.

결괏값으로 한 개밖에 존재하지 않는다는 것을 강력히 제한하고 싶을 때 사용하자.

 

1-2) SingleOrDefault()

어떤 요소도 포함되지 않을경우 기본값을 반환(참조 타입은 null)한다. 하지만 역시 결괏값이 2개 이상이면 예외를 일으킨다.

 

2. First

2-1) First()

여러 개의 값이 반환되는 경우 첫 번째 요소만을 가져온다. 역시 어떤 요소도 포함되지않는다면 예외를 발생시킨다.

 

2-2) FirstOrDefault()

첫번째 요소를 반환하며, 어떤 요소도 포함되지 않을 경우 기본값을 반환(참조 타입은 null)한다. 

 

2-3) 원하는 한개의 요소 가져오기

당연히 단순히 한개의 요소를 가져오는 것으로 해결되지 않는 경우가 많기 때문에

First()를 실행하기 전 첫 번째 위치로 옮기기 위해서 정렬을 수행하는 것도 하나의 방법이다. 

 

2-4) 특정 위치의 요소 가져오기

Skip()과 First()를 함께 사용하여 원하는 요소를 가져올 수 있다. 하지만 요소의 총개수가 3개 이상이라는 가정이 있다.

var answer = (from p in Forwards
              where p.GoalsScored > 0
              orderby p.GoalsScored
              select p).Skip(2).First(); // 세번째 요소를 반환한다.

 

3. 결론

 Single()과 First()를 의미적으로 구분지어서 사용하도록 하자.

 

 

댓글

Designed by JB FACTORY