C#/LINQ

[C#]LINQ 단일 값 가져오기 - Single, SingleOrDefault 메서드

DevStory 2022. 8. 7.

Linq 단일 값 가져오기

C#의 Linq는 단일 값을 가져올 수 있는 기능을 제공합니다.

- Single() 메서드

- SingleOrDefault() 메서드

 

이번 포스팅은 두 가지 함수 사용 방법을 소개합니다.


Single 메서드

C#의 Linq에서 제공하는 Single() 메서드는 데이터 집합에서 유일한 단일 요소를 반환하거나 특정 조건을 만족하는 단일 요소를 반환합니다. Single() 메서드는 오버로드된 두 가지 버전이 존재합니다.

public static TSource Single<TSource>(this IEnumerable<TSource> source);

public static TSource Single<TSource>(
  this IEnumerable<TSource> source, 
  Func<TSource, bool> predicate);

첫 번째 Single() 메서드는 단순히 데이터 집합에서 유일한 단일 요소를 반환합니다. 두 번째 Single() 메서드는 Func 대리자를 인자로 가집니다. 데이터 집합에서 특정 조건을 가지는 요소가 유일한 경우 해당 요소를 반환합니다.


예제 1. 사용 방법

다음 예제는 하나의 요소만 가지는 int 타입의 List에서 Single() 메서드를 호출합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>(){ 100 };

    int getSingleElement = intList.Single();

    Console.WriteLine($"단일 요소: {getSingleElement}");
  }
}

[실행 결과]

단일 요소: 100

예제 2. 특정 조건을 만족하는 요소

이번에는 Func 대리자를 매개변수로 가지는 Single() 메서드를 호출합니다. 데이터 집합의 요소가 200인 요소를 가져옵니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>(){ 100, 200, 300 };

    int getSingleElement = intList.Single(num => num == 200);

    Console.WriteLine($"단일 요소: {getSingleElement}");
  }
}

[실행 결과]

단일 요소: 200

예제 3. 주의사항

Single() 메서드는 다음 상황에서 예외가 발생합니다.


데이터 집합을 null로 할당: ArgumentNullException

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = null;

    int getSingleElement = intList.Single();
  }
}

[에러 내용]


데이터 집합을 빈 값으로 할당: InvalidOperationException

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>();

    int getSingleElement = intList.Single();
  }
}

[에러 내용]


데이터 집합에 요소가 두 개 이상 존재함: InvalidOperationException

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>() { 10, 20 };

    int getSingleElement = intList.Single();
  }
}

[에러 내용]


특정 조건을 만족하는 요소가 두 개 이상 존재함: InvalidOperationException

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>() { 10, 20 };

    int getSingleElement = intList.Single(num => num > 0);
  }
}

[에러 내용]


특정 조건을 만족하는 요소가 없음: InvalidOperationException

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>() { 10, 20 };

    int getSingleElement = intList.Single(num => num > 100);
  }
}

[에러 내용]


SingleOrDefault 메서드

SingleOrDefault() 메서드는 데이터 집합이 빈 값이거나 조건을 만족하는 요소가 없는 경우 예외를 발생시키지 않습니다. 이 점을 제외하면 Single() 메서드와 유사합니다.

public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source);

public static TSource SingleOrDefault<TSource>(
  this IEnumerable<TSource> source, 
  Func<TSource, bool> predicate);

Single() 메서드와 마찬가지로 오버로드된 두 가지 버전이 존재합니다.

※ 주의사항
1. 데이터 집합이 null인 경우 ArgumentNullException이 발생합니다.
2. 데이터 집합에 요소가 두 개 이상 존재하는 경우 InvalidOperationException이 발생합니다.
3. 특정 조건을 만족하는 요소가 없는 경우 InvalidOperationException이 발생합니다.

SingleOrDefault() 메서드는 데이터 집합을 빈 값으로 할당하거나 조건을 만족하는 요소가 없는 경우에만 예외를 발생시키지 않고 데이터 집합 타입의 Default 값을 반환합니다.

예제 1. 사용 방법

다음 예제는 하나의 요소만 가지는 int 타입의 List에서 SingleOrDefault() 메서드를 호출합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>() { 10 };

    int getSingleElement = intList.SingleOrDefault();

    Console.WriteLine($"단일 요소: {getSingleElement}");
  }
}

[실행 결과]

단일 요소: 10

예제 2. 데이터 집합을 빈 값으로 할당

다음 예제는 int 타입의 List를 빈 값으로 할당 후 SigleOrDefault() 메서드를 호출합니다. intList는 int 타입이므로 int 타입의 Default 값인 0이 반환됩니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>();

    int getSingleElement = intList.SingleOrDefault();

    Console.WriteLine($"단일 요소: {getSingleElement}");
  }
}

[실행 결과]

단일 요소: 0

예제 3. 특정 조건을 만족하는 요소가 없는 경우

특정 조건을 만족하는 요소가 없는 경우 데이터 집합 타입의 Default 값이 반환됩니다. 다음 예제는 int 타입의 List에서 50보다 큰 요소가 없으므로 int 타입의 Default 값인 0이 반환됩니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>() { 10, 20, 30 };

    int getSingleElement = intList.SingleOrDefault(num => num > 50);

    Console.WriteLine($"단일 요소: {getSingleElement}");
  }
}

[실행 결과]

단일 요소: 0
반응형

댓글