English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

LINQ 요소 연산자 Single과 SingleOrDefault

요소 연산자                    설명                    
Single                    셋의 유일한 요소나 유일하게 조건을 만족하는 요소를 반환합니다. Single()이 셋에서 어떤 요소도 찾지 못하거나 여러 개의 요소를 찾으면 InvalidOperationException을 터뜨립니다.                    
SingleOrDefault                    Single과 동일하게, 다른 점은 지정된 조건의 요소를 찾지 못할 때 예외를 터뜨리지 않고, 지정된 제너릭 타입의 기본 값을 반환합니다. 그러나 지정된 조건에 대한 요소가 셋에서 여러 개를 찾을 때 InvalidOperationException을 터뜨립니다.                    

Single과 SingleOrDefault은 두 가지 오버로드 메서드를 가지고 있습니다. 첫 번째 오버로드 메서드는 입력 매개변수를 사용하지 않으며, 셋의 단일 요소를 반환합니다. 두 번째 오버로드 메서드는 람다 표현식을 지정 조건의 페드리스로 전달하며, 지정 조건을 만족하는 단일 요소를 반환합니다.

Single()과 SingleOrDefault() 오버로드:        
public static TSource Single<TSource>(this IEnumerable<TSource> source);
public static TSource Single<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source);
public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

Single()은 셋에서 유일한 요소를 반환하거나 지정된 조건을 만족하는 유일한 요소를 반환한다. 주어진 셋이 어떤 요소도 포함하지 않거나 여러 요소를 포함하는 경우, Single()은 InvalidOperationException을 발생시킨다.

SingleOrDefault() 메서드는 Single() 메서드와 동일한 기능을 가진다. 유일한 차이점은, 셋이 비어 있거나 하나 이상의 요소가 포함되지 않거나 지정된 조건에 맞는 하나 이상의 요소가 포함되지 않는 경우, 그것은 셋의 데이터 타입의 기본 값을 반환한다.

IList<int> oneElementList = new List<int>() { 7 };
IList<int> intList = new List<int>() { 7, 10, 21, 30, 45, 50, 87 };
IList<string> strList = new List<string>() { null, "Two", "Three", "Four", "Five" };
IList<string> emptyList = new List<string>();
Console.WriteLine("oneElementList에서 유일한 요소: {0}", oneElementList.Single());
Console.WriteLine("oneElementList에서 유일한 요소: {0}", oneElementList.SingleOrDefault());
Console.WriteLine("emptyList의 요소: {0}", emptyList.SingleOrDefault());
Console.WriteLine("intList에서 유일하게 작은10요소: {0}", intList.Single(i => i < 10));
//다음에 예외를 발생시킨다
//Console.WriteLine("intList에 있는 유일한 요소: {0}", intList.Single());
//Console.WriteLine("intList에 있는 유일한 요소: {0}", intList.SingleOrDefault());
//Console.WriteLine("emptyList에서 유일한 요소: {0}", emptyList.Single());
출력:
oneElementList의 유일한 요소:7 
oneElementList의 유일한 요소:7 
emptyList의 요소: 0 
intList에서 유일하게 작은10요소:7

다음 예제 코드는 Single() 또는 SingleOrDefault()가 지정된 조건에 맞는 어떤 요소도 반환하지 않거나 여러 요소를 반환하는 경우 예외를 발생시킨다.

IList<int> oneElementList = new List<int>() { 7 };
IList<int> intList = new List<int>() { 7, 10, 21, 30, 45, 50, 87 };
IList<string> strList = new List<string>() { null, "Two", "Three", "Four", "Five" };
IList<string> emptyList = new List<string>();
//아래는 오류를 발생시킵니다. 왜냐하면 목록에 여러 작은100의 요소
Console.WriteLine("intList에서 작은100의 요소: {0}", intList.Single(i => i < 100));
//아래는 오류를 발생시킵니다. 왜냐하면 목록에 여러 작은100의 요소
Console.WriteLine("intList에서 작은100의 요소: {0}", intList.SingleOrDefault(i => i < 100));
//목록에 여러 요소가 있기 때문에 아래는 오류를 발생시킵니다
Console.WriteLine("intList에 있는 유일한 요소: {0}", intList.Single());
//목록에 여러 요소가 있기 때문에 아래는 오류를 발생시킵니다
Console.WriteLine("intList에 있는 유일한 요소: {0}", intList.SingleOrDefault());
//아래는 오류를 발생시킵니다. 왜냐하면 목록에 요소가 없기 때문입니다
Console.WriteLine("emptyList에 있는 유일한 요소: {0}", emptyList.Single());

기억해야 할 포인트           

  1. Single()는 집합에 단 하나의 요소가 있어야 합니다.

  2. Single()는 집합에 요소가 하나도 없거나 하나 이상 있을 때 예외를 투げ씨합니다.

  3. Single()에서 조건을 지정했을 때 결과가 요소가 하나도 없거나 여러 개인 경우 예외가 발생합니다.

  4. 집합이나 지정된 조건에 요소가 없을 경우 SingleOrDefault()는 일반형集合 데이터类型的 기본 값을 반환합니다.

  5. 집합이나 지정된 조건에 여러 요소가 있을 경우 SingleOrDefault()는 예외를 발생시킵니다.