C#/LINQ

[C#]LINQ 첫 번째 요소 가져오기 - First, FirstOrDefault 메서드

DevStory 2022. 8. 7.

첫 번째 요소 가져오기

C#의 Linq는 데이터 집합에서 첫 번째 요소를 가져올 수 있는 기능을 제공합니다.

- First() 메서드

- FirstOrDefault() 메서드

 

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


First 메서드

C#의 Linq에서 제공하는 First() 메서드는 데이터 집합에서 첫 번째 요소를 반환합니다. First() 메서드는 오버로드된 두 가지 버전이 존재합니다.

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

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

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

 

First() 메서드를 호출하는 데이터 집합이 null 또는 빈 값으로 할당되거나 First() 메서드의 인자로 전달된 람다식에서 조건을 만족하는 요소가 없는 경우 런타임 에러가 발생합니다.


예제 1. 사용 방법

다음 예제는 int 타입의 List에서 첫 번째 요소를 가져옵니다.

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

    int getFristElement = intList.First();

    Console.WriteLine($"첫 번째 요소: {getFristElement}");
  }
}

[실행 결과]

첫 번째 요소: 10

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

이번에는 Func 대리자를 매개변수로 가지는 First() 메서드를 사용합니다. 데이터 집합의 요소를 20으로 나누었을 때, 나머지가 0인 첫 번째 요소를 가져옵니다.

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

    int getFristElement = intList.First(num => num % 20 == 0);

    Console.WriteLine($"첫 번째 요소: {getFristElement}");
  }
}

[실행 결과]

첫 번째 요소: 20

예제 3. 주의사항

First() 메서드를 호출하는 데이터 집합이 null로 할당된 경우 ArgumentNullException 예외가 발생합니다.

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

    int getFristElement = intList.First();
  }
}

[에러 내용]


First() 메서드를 호출하는 데이터 집합이 빈 값으로 할당된 경우 InvalidOperationException 예외가 발생합니다.

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

    int getFristElement = intList.First();
  }
}

[에러 내용]


Func 대리자를 가지는 First() 메서드에서 특정 조건을 만족하는 요소가 없는 경우 InvalidOperationException 예외가 발생합니다.

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

    int getFristElement = intList.First(num => num % 100 == 0);
  }
}

[에러 내용]


FirstOrDefault 메서드

FirstOrDefault() 메서드는 First() 메서드와 동일한 작업을 수행하지만, 한 가지 차이점이 있습니다. 데이터 집합이 빈 값이거나 FirstOrDefault() 메서드의 인자로 전달된 람다식에서 조건을 만족하는 요소가 없더라도 예외가 발생하지 않습니다.

 

데이터 집합이 빈 값 또는 조건을 만족하는 요소가 없는 경우 FirstOrDefault() 메서드를 호출한 데이터 집합 타입의 Default 값을 반환합니다.

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

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

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


예제 1. 사용 방법

다음 예제는 int 타입의 List에서 첫 번째 요소를 가져옵니다.

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

    int getFristElement = intList.FirstOrDefault();

    Console.WriteLine($"첫 번째 요소: {getFristElement}");
  }
}

[실행 결과]

첫 번째 요소: 10

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

이번에는 int 타입의 List에서 20으로 나누었을 때, 나머지가 0인 첫 번째 요소를 가져옵니다.

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

    int getFristElement = intList.FirstOrDefault(num => num % 20 == 0);

    Console.WriteLine($"첫 번째 요소: {getFristElement}");
  }
}

[실행 결과]

첫 번째 요소: 20

예제 3. 첫 번째 요소가 없는 경우

이번에는 int 타입의 List에서 100으로 나누었을 때, 나머지가 0인 첫 번째 요소를 가져옵니다.

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

    int getFristElement = intList.FirstOrDefault(num => num % 100 == 0);

    Console.WriteLine($"첫 번째 요소: {getFristElement}");
  }
}

[실행 결과]

첫 번째 요소: 0

조건을 만족하는 요소가 없으므로 데이터 집합 타입의 Default 값을 반환합니다. 컬렉션 객체 intList는 int 타입이므로 int 타입의 Default 값이 반환됩니다.


예제 4. 주의사항

빈 값과 null은 엄연히 다른 개념입니다. 따라서, 데이터 집합이 null로 할당된 경우에는 ArgumentNullException 예외가 발생합니다.

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

    int getFristElement = intList.FirstOrDefault();
  }
}

[에러 내용]

반응형

댓글