LINQ 표준 연산 메서드(LINQ 쿼리식을 메서드 호출 코드로 바꾸기)

00·2024년 12월 29일

C#

목록 보기
91/149
using System;
using System.Linq; // where(), OrderBy(), Select() 등의 메서드 호출 코드를 사용하려면,
                   // 'System.Collections.Generic' 네임스페이스 using 문이 아니라,
                   // 'System.Linq' 네임스페이스 using 문을 선언해야 합니다.
                   // 왜냐하면 이들 메서드는 System.Linq 네임스페이스에 정의되어 있는
                   // IEnumerable<T>의 확장 메서드이기 때문입니다.


/*
LINQ 쿼리식을 메서드 호출 코드로 바꾸기:
LINQ 쿼리식을 메서드 호출 코드로 바꾸면, 
쿼리식에서 지원하지 않는 Aggregate, All, Any, Average, Concat 등과 같은 
다양한 LINQ 표준 연산 메서드를 사용할 수 있습니다.
 */


// LINQ 쿼리식을 메서드 호출 코드로 바꾸기.
// LINQ를 사용하여 Profile 객체 배열에서
// 특정 조건을 만족하는 프로필을 선택하고, 정렬하고, 새로운 형태로 변환하는 방법을 보여줌.
namespace SimpleLinq2
{
    class Profile
    {
        public string Name { get; set; }
        public int Height { get; set; }
    }


    class MainApp
    {
        static void Main(string[] args)
        {
            Profile[] arrProfile =
            {
                new Profile(){Name="정우성", Height=186},
                new Profile(){Name="김태희", Height=158},
                new Profile(){Name="고현정", Height=172},
                new Profile(){Name="이문세", Height=178},
                new Profile(){Name="하하", Height=171}
            };


            // LINQ 쿼리식을 메서드 호출 코드로 바꾸기.
            // from절의 범위 변수 profile은 각 메서드에 입력되는 람다식의 매개변수로 바꿈.
            var profiles = arrProfile
                              .Where(profile => profile.Height < 175) // where를 Where() 메서드로 바꿈.
                              .OrderBy(profile => profile.Height) // orderby를 OrderBy() 메서드로 바꿈. 
                              .Select(profile =>
                                     new
                                     {
                                         Name = profile.Name,
                                         InchHeight = profile.Height * 0.393
                                     }); // select를 Select() 메서드로 바꿈.

            foreach (var profile in profiles)
                Console.WriteLine($"{profile.Name}, {profile.InchHeight}");
        }
    }
}


/*
출력 결과

김태희, 62.094
하하, 67.203
고현정, 67.596
 */

코드 설명

이 코드는 LINQ를 사용하여 arrProfile 배열에 있는 Profile 객체들을 필터링하고 정렬한 후, 새로운 형태의 데이터로 변환하는 예제입니다.

1. 데이터 준비

  • Profile 클래스: 사람의 이름(Name)과 키(Height)를 프로퍼티로 가집니다.
  • arrProfile: 5명의 프로필 정보를 담고 있는 Profile 객체 배열입니다.

2. LINQ 쿼리

arrProfile 배열에 대해 다음과 같은 LINQ 쿼리 작업을 수행합니다.

  • Where(profile => profile.Height < 175):

    • arrProfile 배열에서 Height 프로퍼티 값이 175보다 작은 Profile 객체만 필터링합니다. 즉, 키가 175cm 미만인 사람들만 선택합니다.
    • 람다식 profile => profile.Height < 175profile 객체를 입력으로 받아서 profile.Height < 175 조건을 만족하는지 여부를 반환하는 함수입니다.
  • OrderBy(profile => profile.Height):

    • Where 메서드에서 필터링된 Profile 객체들을 Height 프로퍼티 값을 기준으로 오름차순으로 정렬합니다. 즉, 키가 작은 사람부터 큰 사람 순서로 정렬합니다.
  • Select(profile => new { Name = profile.Name, InchHeight = profile.Height * 0.393 }):

    • 정렬된 Profile 객체들을 새로운 익명 객체로 변환합니다.
    • Profile 객체에 대해 Name 프로퍼티는 그대로 유지하고, Height 프로퍼티 값에 0.393을 곱하여 인치 단위로 변환한 값을 InchHeight 프로퍼티에 저장합니다.

3. 결과 출력

foreach 루프를 사용하여 변환된 데이터를 출력합니다. 각 객체의 Name 프로퍼티와 InchHeight 프로퍼티 값을 출력합니다.

LINQ 쿼리식을 메서드 호출 코드로 바꾸면 뭐가 좋아?

LINQ 쿼리식을 메서드 호출 코드로 바꾸는 것을 메서드 구문(Method Syntax)이라고 합니다.

장점:

  • 가독성 향상: 메서드 체이닝을 통해 쿼리의 흐름을 명확하게 보여주므로 코드의 가독성이 향상됩니다.
  • 유연성 증대: 메서드 구문은 쿼리 연산자보다 더 많은 기능을 제공하므로 복잡한 쿼리를 더 유연하게 표현할 수 있습니다.
  • 디버깅 용이: 메서드 호출 단위로 디버깅이 가능하므로 오류를 찾고 수정하기 용이합니다.
  • IntelliSense 지원: IDE의 IntelliSense 기능을 활용하여 코드 작성을 더 빠르고 효율적으로 할 수 있습니다.

단점:

  • 쿼리 연산자에 익숙한 경우: 쿼리 연산자 방식보다 직관적이지 않을 수 있습니다.

예시:

위 코드의 LINQ 쿼리를 메서드 구문으로 바꾸면 다음과 같습니다.

var profiles = arrProfile.Where(profile => profile.Height < 175)
                          .OrderBy(profile => profile.Height)
                          .Select(profile => new { Name = profile.Name, InchHeight = profile.Height * 0.393 });

이처럼 메서드 구문은 쿼리 연산자 방식보다 코드의 흐름을 더 명확하게 보여주고, 다양한 메서드를 활용하여 쿼리를 더 유연하게 표현할 수 있도록 해줍니다.

결론적으로 LINQ 쿼리식을 메서드 호출 코드로 바꾸는 것은 코드의 가독성, 유연성, 디버깅 용이성 등을 향상시키는 데 도움이 됩니다.


LINQ 쿼리식을 메서드 호출 코드로 바꾸는 것의 장점?

LINQ 쿼리식을 메서드 호출 코드로 바꾸면 LINQ 표준 연산자를 더욱 광범위하게 사용할 수 있게 됩니다.

LINQ 표준 연산자LINQ 표준 연산 메서드와 같은 의미입니다. 이들은 System.Linq 네임스페이스에 정의된 확장 메서드로, 컬렉션이나 배열과 같은 IEnumerable 형식의 데이터에 대해 쿼리 작업을 수행할 수 있도록 해줍니다.

쿼리식에서 지원하는 연산자와 메서드의 차이

C#의 쿼리식은 SQL과 유사한 문법을 사용하여 LINQ 쿼리를 작성하는 방법입니다. 하지만 쿼리식에서 지원하는 연산자는 제한적입니다.

  • 쿼리식에서 지원하는 연산자 (11개): select, from, where, orderby, group, join, let, into, equals, by, ascending/descending

  • LINQ 표준 연산 메서드 (53개): Where, Select, OrderBy, GroupBy, Join, Aggregate, All, Any, Average, Concat, Contains, Count, DefaultIfEmpty, Distinct, ElementAt, ElementAtOrDefault, Except, First, FirstOrDefault, Intersect, Last, LastOrDefault, LongCount, Max, Min, OfType, OrderByDescending, Reverse, SequenceEqual, Single, SingleOrDefault, Skip, SkipWhile, Sum, Take, TakeWhile, ToArray, ToList, ToLookup, ToDictionary, Union, Zip

메서드 호출 코드의 장점

LINQ 쿼리식을 메서드 호출 코드로 바꾸면 쿼리식에서 지원하지 않는 Aggregate, All, Any, Average, Concat 등과 같은 다양한 LINQ 표준 연산 메서드를 사용할 수 있습니다.

  • 더욱 다양한 쿼리 작업 가능: 쿼리식에서 표현하기 어려운 복잡한 쿼리 작업을 메서드 호출을 통해 더욱 간결하고 효율적으로 표현할 수 있습니다.
  • 코드의 가독성 향상: 메서드 체이닝을 통해 쿼리의 흐름을 명확하게 보여주므로 코드의 가독성이 향상됩니다.
  • 유연성 증대: 메서드 구문은 쿼리 연산자보다 더 많은 기능을 제공하므로 복잡한 쿼리를 더 유연하게 표현할 수 있습니다.

결론적으로, LINQ 쿼리식을 메서드 호출 코드로 바꾸면 LINQ 표준 연산자(메서드)를 더욱 광범위하게 활용하여 다양하고 복잡한 쿼리 작업을 수행할 수 있으며, 코드의 가독성과 유연성을 높일 수 있습니다.

https://www.youtube.com/watch?v=jAPcP-QbCGA&list=PLdo4fOcmZ0oULFjxrOagaERVAMbmG20Xe&ab_channel=dotnet

0개의 댓글