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 < 175는 profile 객체를 입력으로 받아서 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)이라고 합니다.
장점:
단점:
예시:
위 코드의 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 표준 연산자(메서드)를 더욱 광범위하게 활용하여 다양하고 복잡한 쿼리 작업을 수행할 수 있으며, 코드의 가독성과 유연성을 높일 수 있습니다.