C#/LINQ

[C#]LINQ 특정 조건을 만족하는 데이터 생략하기 - SkipWhile 메서드

DevStory 2022. 8. 14.

SkipWhile 메서드

C#의 Linq에서 제공하는 SkipWhile() 메서드는 데이터 집합의 데이터를 처음 위치에서 순회합니다. 데이터 집합을 순회하는 동안 SkipWhile() 메서드에 전달된 조건문의 결과가 false인 경우 반복문을 중단하고 나머지 데이터를 반환합니다.

 

Sytem.Linq 네임스페이스에 존재하는 SkipWhile() 메서드는 두 가지 오버로드된 버전이 존재합니다.

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

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

SkipWhile() 메서드의 매개변수는 동일하지만, 두 번째 매개변수인 Func 대리자의 매개변수가 다른 것을 확인할 수 있습니다.

 

첫 번째 SkipWhile() 메서드의 Func 대리자는 데이터 집합의 요소만 접근할 수 있습니다. 두 번째 SkipWhile() 메서드의 Func 대리자는 데이터 집합의 요소와 인덱스를 접근할 수 있습니다.


에제 1. int 타입의 List

다음 예제는 1부터 10까지 int 타입의 값을 가지는 List에서 SkipWhile() 메서드를 호출합니다. SkipWhile() 메서드에는 값이 5보다 작은 경우 true를 반환하고 그렇지 않으면 false를 반환하는 조건문을 전달합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>()
    {
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    };

    List<int> SkipWhileResult = intList.SkipWhile(num => num < 5).ToList();

    foreach (int num in SkipWhileResult)
    {
      Console.WriteLine(num);
    }
  }
}

[실행 결과]

5
6
7
8
9
10

SkipWhile() 메서드는 intList의 처음 위치인 1부터 데이터를 순회합니다. SkipWhile() 메서드에 전달된 조건문이 false인 경우 나머지 데이터를 반환합니다.


예제 2. 정렬되지 않은 int 타입의 List

다음 예제는 1부터 5까지 int 타입의 값을 가지는 List에서 SkipWhile() 메서드를 호출합니다. SkipWhile() 메서드에는 값이 3보다 작은 경우 true를 반환하고 그렇지 않으면 false를 반환하는 조건문을 전달합니다.

 

첫 번째 예제와 다른 점은 List의 데이터가 정렬되지 않았다는 것입니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>()
    {
      1, 3, 4, 2, 5
    };

    List<int> SkipWhileResult = intList.SkipWhile(num => num < 3).ToList();

    foreach (int num in SkipWhileResult)
    {
      Console.WriteLine(num);
    }
  }
}

[실행 결과]

3
4
2
5

3보다 작은 요소인 2가 출력된 것을 확인할 수 있습니다. SkipWhile() 메서드는 데이터 집합의 처음 위치부터 순회하여 조건을 확인하기 때문입니다.

 

따라서, SkipWhile() 메서드의 조건문이 false인 경우 나머지 데이터는 조건문을 확인하지 않습니다.


예제 3. 질의 구문에서 SkipWhile 메서드 호출

질의 구문에는 SkipWhile() 메서드를 지원하지 않습니다. 따라서, 메서드 구문과 혼합하여 사용합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>()
    {
      1, 2, 3, 4, 5
    };

    List<int> SkipWhileResult = (from   num in intList
                                 select num).SkipWhile(num => num < 3).ToList();

    foreach (int num in SkipWhileResult)
    {
      Console.WriteLine(num);
    }
  }
}

[실행 결과]

3
4
5

예제 4. 인덱스를 매개변수로 가지는 SkipWhile 메서드

다음 예제는 Func 대리자에서 인덱스를 매개변수로 가지는 SkipWhile() 메서드를 사용합니다. index가 3보다 작은 경우 true를 반환하는 조건문을 SkipWhile() 메서드에 전달합니다.

class Program
{
  static void Main(string[] args)
  {
    List<string> strList = new List<string>()
    {
      "One", "Two", "Three", "Four", "Five"
    };

    List<string> SkipWhileResult = strList
                                   .SkipWhile((strValue, index) => index < 3)
                                   .ToList();

    foreach (string value in SkipWhileResult)
    {
      Console.WriteLine(value);
    }
  }
}

[실행 결과]

Four
Five
반응형

댓글