C#/LINQ

[C#]LINQ 데이터 필터링 방법 - Where절

DevStory 2022. 7. 10.

Where절

LINQ의 Where문은 원본 데이터에서 일부 조건을 만족하는 데이터를 추출해야하는 경우 사용됩니다.

 

예를 들자면, 아래 조건을 만족하는 데이터를 추출하기 위해 Where문을 사용할 수 있습니다.

- 이름이 "A"로 시작하는 문자열만 추출

- 급여가 4,000만원 이상인 직원을 추출

- 나이가 20세 이상인 사람을 추출


오버로드된 두 가지 버전

메서드 구문을 사용하여 질의를 작성하는 경우 Where() 메서드를 사용합니다. Where() 메서드는 오버로드된 두 가지 버전이 존재합니다.

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

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

Where() 메서드는 System.Linq 네임스페이스의 Enumerable 클래스에 존재하며 IEnumerable<T> 인터페이스의 확장 메서드입니다. 그리고 Func 대리자를 매개변수로 사용합니다.

 

LINQ의 확장 메서드한 내용은 아래 포스팅을 참고해주세요.

 

[C#]LINQ 확장 메서드

LINQ 확장 메서드 LINQ의 Where(), Union(), Join() 메서드 등.. 해당 메서드들은 Enumerable 클래스에서 구현됩니다. 이 메서드들은 IEnumerable 인터페이스 타입의 확장 메서드로 구현됩니다. 다음 예제를 살펴

developer-talk.tistory.com

Func 대리자에 대한 내용은 아래 포스팅을 참고해주세요.

 

[C#]람다식, 람다표현식(Lambda expression)

람다식(Lambda expression)이란? 람다식(Lambda)식은 접근자, 함수 이름, return문이 없는 익명 함수(anonymous function)입니다. 람다식을 사용하면 더 짧은 코드를 작성할 수 있으며 코드를 더 가독성 있게 만

developer-talk.tistory.com


예제 1. Where절 사용 방법

Where절을 사용하는 간단한 예제입니다. int 타입의 List에서 10보다 큰 숫자를 추출합니다.

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

    // 1. 질의 구문(Query Syntax)
    List<int> linqQueryResult = (from   num in liNum
                                 where  num > 5
                                 select num).ToList();

    // 2. 메서드 구문(Method Syntax)
    List<int> linqMethodResult = liNum.Where(num => num > 5).ToList();


    Console.WriteLine("질의 구문");
    foreach (int num in linqQueryResult)
      Console.Write(num + " ");

    Console.WriteLine("\n메서드 구문");
    foreach (int num in linqMethodResult)
      Console.Write(num + " ");
  }
}

[실행 결과]

질의 구문
6 7 9 10
메서드 구문
6 7 9 10

다음 예제는 Where절에 여러 조건문을 작성하는 방법입니다. 10보다 크고 홀수인 숫자를 추출합니다.

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

    // 1. 질의 구문(Query Syntax)
    List<int> linqQueryResult = (from   num in liNum
                                 where  num > 5 && num % 2 != 0
                                 select num).ToList();

    // 2. 메서드 구문(Method Syntax)
    List<int> linqMethodResult = liNum.Where(num => num > 5 && num % 2 != 0).ToList();


    Console.WriteLine("질의 구문");
    foreach (int num in linqQueryResult)
      Console.Write(num + " ");

    Console.WriteLine("\n메서드 구문");
    foreach (int num in linqMethodResult)
      Console.Write(num + " ");
  }
}

[실행 결과]

질의 구문
7 9
메서드 구문
7 9

예제 2. 사용자 정의 클래스

다음 예제는 사용자 정의 클래스 타입인 List에서 Where절을 사용하는 방법입니다. 나이(Age)가 25살 이상이고 급여(Salary)가 45,000원 미만인 데이터를 추출합니다.

class Person
{
  public int ID { get; set; }
  public string Name { get; set; }
  public int Age { get; set; }
  public int Salary { get; set; }    
  public override string ToString()
  {
    return "ID: " + ID + ", Name: " + Name + ", Age: " + Age + ", Salary: " + Salary;
  }
}

class Program
{
  static void Main(string[] args)
  {
    List<Person> person = new List<Person>
    {
      new Person() { ID = 100, Name = "Bob",     Age = 20, Salary = 30000  },
      new Person() { ID = 200, Name = "Tim",     Age = 25, Salary = 40000 },
      new Person() { ID = 300, Name = "Charles", Age = 30, Salary = 50000 }
    };

    // 1. 질의 구문(Query Syntax)
    List<Person> linqQueryResult = (from   obj in person
                                    where  obj.Age >= 25 && obj.Salary < 45000
                                    select obj).ToList();

    // 2. 메서드 구문(Method Syntax)
    List<Person> linqMethodResult = 
        person.Where(obj => obj.Age >= 25 && obj.Salary < 45000).ToList();

    Console.WriteLine("질의 구문");
    foreach (Person obj in linqQueryResult)
      Console.Write(obj.ToString());

    Console.WriteLine("\n메서드 구문");
    foreach (Person obj in linqMethodResult)
      Console.Write(obj.ToString());
  }
}

[실행 결과]

질의 구문
ID: 200, Name: Tim, Age: 25, Salary: 40000
메서드 구문
ID: 200, Name: Tim, Age: 25, Salary: 40000
반응형

'C# > LINQ' 카테고리의 다른 글

[C#]LINQ 특정 타입 추출하는 방법 - OfType 메서드  (0) 2022.07.12
[C#]LINQ 인덱스 가져오는 방법  (0) 2022.07.12
[C#]LINQ SelectMany 메서드  (0) 2022.07.10
[C#]LINQ Select절  (0) 2022.07.10
[C#]LINQ 확장 메서드  (0) 2022.07.10

댓글