LINQ: where, orderby, select

00·2024년 12월 28일

C#

목록 보기
87/149
using System;
using System.Collections.Generic; // List<T>와 같은 제네릭 컬렉션을 사용하기 위해 필요
                                  // List<T>는 배열과 유사하지만 크기가 동적으로 변하는 컬렉션
using System.Linq; // LINQ(Language Integrated Query)를 사용하기 위해 필요 


/*
where:
필터(Filter) 역할.
from 절이 데이터 원본으로부터 뽑아낸 범위 변수가 가져야 하는 조건을 
where 연산자에 인수로 입력하면, LINQ는 해당 조건에 부합하는 데이터만 걸러냅니다.

orderby:
데이터의 정렬을 수행하는 연산자입니다.

select:
select 절은 최종 결과를 추출합니다.

->
from 절에서 데이터 원본으로부터 범위 변수를 뽑아내고,
where 절에서 이 범위 변수의 조건을 검사한 후,
orderby 절에서 그 결과를 정렬하고,
select 문을 이요하여 최종 결과를 추출합니다.
 */


// List<Profile>을 사용하여 Profile 객체의 컬렉션을 생성하고,
// LINQ를 사용하여 컬렉션을 쿼리하고 결과를 출력합니다.
namespace SimpleLinq
{
    class Profile // Name과 Height 프로퍼티를 가진 클래스 Profile
    {
        public string Name { get; set; }
        public int Height { get; set; }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            Profile[] arrProfile = // 5개의 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}
            };


            // var 형식으로 선언된 profiles의 실제 형식?
            // LINQ 질의(쿼리) 결과는 IEnumerable<T>로 반환되는데, 이때 형식 매개변수 T는 select 문에 의해 결정됨.
            // select new { Name = profile.Name, InchHeight = profile.Height * 0.393 } 부분에서
            // new { ... } 구문을 사용하여 익명 형식을 생성하고 있음.
            // 따라서 profiles 변수는 익명 형식임.
            // 익명 형식은 이름이 없는 클래스와 같습니다. 컴파일러가 익명 형식의 이름을 자동으로 생성하고,
            // Name과 InchHeight 프로퍼티를 가진 클래스를 정의합니다.
            // var 키워드는 컴파일러가 변수의 타입을 자동으로 유추하도록 하는 키워드입니다.
            // 이 경우 컴파일러는 select 문의 결과를 보고 profiles 변수의 타입을 익명 형식으로 유추합니다.
            // 따라서 profiles 변수는 Name과 InchHeight 프로퍼티를 가진 익명 형식의 객체를 저장하는 컬렉션입니다.
            var profiles = from profile in arrProfile // arrProfile 배열의 각 요소를
                                                      // profile이라는 변수에 할당

                           where profile.Height < 175 // profile의 Height 프로퍼티 값이 175보다 작은 요소만 선택하고,

                           orderby profile.Height // 선택된 요소를 Height 프로퍼티 값을 기준으로 오름차순으로 정렬

                           select new // new { ... } 구문(익명 형식)을 사용하여,
                                      // Name과 InchHeight 프로퍼티를 가진 새로운 객체를 생성합니다.
                                      // InchHeight는 Height 값에 0.393을 곱하여 센티미터를 인치로 변환한 값입니다.
                           {
                               Name = profile.Name,
                               InchHeight = profile.Height * 0.393
                           };

            foreach (var profile in profiles) // profiles 쿼리 결과를 순회하며 각 요소를 profile이라는 변수에 할당합니다.
                Console.WriteLine($"{profile.Name}, {profile.InchHeight}"); // profile의 Name과 InchHeight 프로퍼티 값을 출력합니다.
        }
    }
}


/*
출력 결과

김태희, 62.204
하하, 67.322
고현정, 67.716
*/

0개의 댓글