반응형

 

리스트에서 내가 원하는 조건의 데이터를 1개 가져올때 사용하는 함수인

FirstOrDefault/SingleOrDefault가 있다.

하지만 두함수가 미묘하게 다르다. (이름부터 다르니, 무언가 다르다는 것을 암시한다.)

그래서 그 차이점을 비교해보려고 한다.

 

어떠한 차이점을 비교할 것인가?

그 답은 내가 원하는 조건의 데이터가 1개가 나올 수도 있지만, 0개가 나올 수도 있고, n개가 나올 수도 있다.

이럴때 두함수가 어떻게 다른지 설명해보려고 한다.

 

그 전에 샘플 리스트 데이터를 생성!

1
2
3
4
5
6
7
8
9
var list = new List<Person>() { 
    new Person() { Name = "홍길동", Age = 20 },
    new Person() { Name = "김두한", Age = 30 },
    new Person() { Name = "피카츄", Age = 52 },
    new Person() { Name = "이승엽", Age = 41 },
    new Person() { Name = "이종범", Age = 32 },
    new Person() { Name = "서장훈", Age = 15 },
    new Person() { Name = "김병현", Age = 22 }
};
cs

 

데이터가 N개

1
2
3
4
// 조건     : 나이가 20살 이상인 사람
// 추출대상 : 홍길동/김두한/피카츄/이승엽/이종범/김병현
var first = list.FirstOrDefault(p => p.Age >= 20);
var single = list.SingleOrDefault(p => p.Age >= 20);
cs

 

나이가 20이상인 사람을 조건으로 두함수를 실행하였다.

first 변수에는 20살 이상인 사람 중, 한명의 데이터가 들어갔고

single 변수에는 들어가지 않고, 오류가 발생했다. ('Sequence contains more than one matching element')

대략적으로 오류의 내용은 1개 이상의 데이터가 포함되었다는 것을 말한다.

SingleOrDefault함수는 N개의 데이터를 허용하지 않는 다는 것을 알 수 있다.

 

 

데이터가 1개

1
2
3
4
// 조건     : 나이가 20인 사람
// 추출대상 : 홍길동
var item1 = list.FirstOrDefault(p => p.Age = 20);
var item2 = list.SingleOrDefault(p => p.Age = 20);
cs

 

두함수 모두, 홍길동 데이터가 잘 들어갔다.

데이터가 1개일때에는 두함수의 차이가 없다는 것을 알 수 있었다.

 

데이터가 0개

1
2
3
4
// 조건     : 나이가 100인 사람
// 추출대상 : 없음
var first = list.FirstOrDefault(p => p.Age == 100);
var single = list.SingleOrDefault(p => p.Age == 100);
cs

 

조회되는 데이터가 없을때, first/single 변수에 모두 null값이 셋팅되었다.

그러므로 두함수를 사용한다면, 데이터의 null 체크는 필수이다.

 

결론

데이터가 1개이거나, 0개이면 FirstOrDefault/SingleOrDefault 함수의 차이가 없다는 것을 알 수 있다.

하지만, 데이터가 여러개 조회되면 두함수는 크게 달라진다.

FirstOrDefault는 여러 데이터 중 1개의 데이터가 무조건 조회되고

SingleOrDefault는 오류를 발생 시킨다.

 

그러면 어떠한 함수를 사용해야 될까?

그것은 개발하는 상황에 맞게 사용해야 된다.

 

여러 데이터가 나와서는 안되면, SingleOrDefault 함수를 사용해서 미연에 방지해야한다.

하지만 여러 데이터 중에 1개의 데이터가 나와도 상관없다면, 오류를 발생하지 않는 FirstOrDefault 함수를 사용하는 것이 맞다.

 

반응형

+ Recent posts