이번 포스팅에서는 First와 Single을 비교하고 FirstOrDefault 와 SingleOrDefault의 비교를 통해 각각의 개념을 알아보도록 하겠습니다.
1) single() vs first()
![[c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 1) single() vs first() 예제코드](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
1~9로 구성된 리스트에서 1에 해당하는 값을 추출하는 코드입니다.
각각 First와 Single을 이용했는데요.
어떤 결과가 나올까요?
output:
![[c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 1) single() vs first() output](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
같은 결과가 나왔습니다. 그렇다면 둘은 같은 것일까요?
이번에는 list를 조금 수정해보겠습니다.
![[c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 1) single() vs first() 리스트수정](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
1을 하나 더추가해서 2개로 만들었습니다.
![[c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 1) single() vs first() [c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 1) single() vs first()](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
그 후 Single메소드를 실행 시켜보겠습니다.
output:
![[c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 1) single() vs first() [c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 1) single() vs first()](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
한개 이상의 요소를 포함하고 있어서 발생되는 에러라고 하는데요.
Single의 경우 조건에 맞는 대상이 2개 이상이 있으면 안됩니다.
그렇다면, First를 실행시켜볼까요?
![[c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 1) single() vs first() first출력](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
output:
![[c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 1) single() vs first() [c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 1) single() vs first()](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
정상적으로 1을 뽑아냅니다.
여기서 둘의 차이를 명확하게 알 수 있습니다.
Single, First 둘다 하나의 값을 추출하는데 사용되는 것은 맞으나, 추출할곳(여기선 list)에 조건에 맞는 값이 하나만 있다라는 확신이 있을때만 Single을 사용해야 합니다.
2) SingleOrDefault vs FirstOrDefault
이 두기능은 조건에 맞는 값이 없을 경우 오류를 발생시키는 것이 아니라 null을 발생시키는 용도로 사용합니다.
굳이 null을 발생시키는 이유는 개발자들이 if value == null 조건문을 통해 여러가지 컨트롤이 가능하기 때문입니다.
여기서 주의할점은 Single에서 오류가 났던 것은 SingleOrDefault로 해도 여전히 오류가 납니다.
![[c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 2) SingleOrDefault vs FirstOrDefault Single 오류 예제](https://blog.kakaocdn.net/dn/7OAIT/btrHkpxuFBm/OozKZsLj1WUBjpZHkzhfxK/img.png)
output:
![[c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 2) SingleOrDefault vs FirstOrDefault [c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 2) SingleOrDefault vs FirstOrDefault](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
SingleOrDefault는 오로지 null처리를 하기 위한 기능이 추가된것일뿐, 여전히 Single의 속성을 가지고 있기 때문입니다.
여기서 1을 의도적으로 없애보겠습니다.
그렇다면 조건에 맞는 값이 없겠죠?
![[c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 2) SingleOrDefault vs FirstOrDefault [c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 2) SingleOrDefault vs FirstOrDefault](https://blog.kakaocdn.net/dn/GD16r/btrHkorQc4J/qsy4bXYTox4BsG96ikAcMk/img.png)
디버깅을 통해 확인해보니 0이 들어온것을 알 수있습니다.
![[c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 2) SingleOrDefault vs FirstOrDefault [c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 2) SingleOrDefault vs FirstOrDefault](https://blog.kakaocdn.net/dn/b0LgWa/btrHkorQdFL/RT7m6A1vo6BKKyKVpoJZJK/img.png)
즉 int의 경우에는 default값인 0을 반환했습니다.
반면 string의 경우 default값인 null을 반환합니다.
![[c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 2) SingleOrDefault vs FirstOrDefault [c#] LINQ First vs Single | FirstOrDefault vs SingleOrDefault 차이 - undefined - 2) SingleOrDefault vs FirstOrDefault](https://blog.kakaocdn.net/dn/dc3Aug/btrHjdqZ8Qg/zJzEYADIoDXKBcx1B7KcEK/img.png)
FirstOrDefault는 앞서 설명한 First의 속성을 가지고 있으면서, null을 처리하는 기능을 가지고 있습니다.
이미 앞에서 다 설명했기 때문에 자세한 설명은 생략합니다.
'c#' 카테고리의 다른 글
[c#] Insert, Update, Delete 하는법 with EntityFramework (0) | 2022.07.21 |
---|---|
[c#] localdb에 EntityFramework 연결 하는 방법 (0) | 2022.07.19 |
[c#] SQL in / not in 기능을 LINQ로 구현 (0) | 2022.07.15 |
[c#] 양수일때 + 넣기 (using String.Format) (0) | 2022.07.14 |
[c#] string format ### 000 차이 (0) | 2022.07.13 |
댓글
꼬예님의
글이 좋았다면 응원을 보내주세요!
이 글이 도움이 됐다면, 응원 댓글을 써보세요. 블로거에게 지급되는 응원금은 새로운 창작의 큰 힘이 됩니다.
응원 댓글은 만 14세 이상 카카오계정 이용자라면 누구나 편하게 작성, 결제할 수 있습니다.
글 본문, 댓글 목록 등을 통해 응원한 팬과 응원 댓글, 응원금을 강조해 보여줍니다.
응원금은 앱에서는 인앱결제, 웹에서는 카카오페이 및 신용카드로 결제할 수 있습니다.