ITEM 43 :: EFFECTIVE C#


안녕하세요, 43번째 시간입니다.


이번 챕터는 쿼리 결과의 의미를 명확히 강제하고, Single()과 First()를 사용하라, 입니다. 음…이건 시작해봐야 알 것 같네요.

설명

  1. LINQ 라이브러리를 살펴보면 대부분이 시퀀스를 반환하도록 설계되었으나, 단일의 값을 반환하는 메서드도 포함하고 있다.

  2. Single()은 정확히 1개의 요소만을 반환한다. 요소가 없거나 1개보다 많을경우 예외를 던지게된다.

  3. 이는 개발자의 의도를 나타낼 수 있는 기능이기도 하다.(여러 개 혹은 갯수가 없다는 것 자체가 예외라는 것으로!)

  4. 혹은 갯수가 없거나 한 개의 요소만을 포함할 수 있다면 SingleOrDefault() 메서드를 사용할 수도 있다(요소가 없을 시 Null을 반환한다) 허나, 이 메소드 또한 2개 이상의 요소를 반환하면 예외를 던진다.

  5. 한개의 값만 반환 받거나 혹은 여러개의 값을 반환받게 하고싶은 경우에는 First()를 사용하면 좋다.

  6. 이 경우는 하나의 요소만이 반환될 것을 기대하기는 하지만 때로는 여러 개의 값이 반환되는 경우도 허용된다. 요소가 아예 없을 경우에는 First()는 예외를 던지며, FirstOrDefault는 Null을 반환한다.

  7. 또한 무조건 첫 번째 요소를 가져오는 것이 아닌 특정값을 가져오고 싶다면 방법이 있다. 원하는 값을 첫번째로 오게하기 위해 정렬을 수행하는 것이다. (마지막 위치로 가게해도 문제는 없지만, 시간이 조금 더 걸린다.)

  8. 원하는 값의 위치를 정확히 알고 있을 경우에는 Skip()과 First를 함께 이용하여 원하는 요소를 가져올 수 있다.

결론

결론적으로 단일의 스칼라 값이 필요한 경우 시퀀스를 반환하는 것이 아닌 단일의 스칼라 값 그 자체를 반환하도록 하는 것이 좋으며, First나 Last, Single을 사용함으로써 개발자의 의도를 뚜렷하게 드러내는 것이 좋다. 혹여 다른 메서드를 사용해야할 경우에는 다른 방법을 사용할 수 없는지 고민하길 바란다. 이외의 메서드를 사용하게 되면, 가독성이 떨어져 읽기 어려울 뿐만 아니라, 그로인해 유지보수도 어려워진다.