0Pricing
C# Academy · 강의

OrderBy와 그룹화

결과를 정렬하고 그룹화합니다

OrderBy와 그룹화은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

OrderBy로 정렬하기

OrderBy는 선택한 키를 기준으로 시퀀스를 오름차순 정렬합니다. 람다는 정렬에 사용할 값을 반환합니다.

새로운 정렬 시퀀스를 반환하며 안정적입니다. 즉, 키가 같은 요소는 원래의 상대적 순서를 유지합니다.

using System;
using System.Linq;

int[] nums = { 4, 1, 3, 2 };
var sorted = nums.OrderBy(n => n);
Console.WriteLine(string.Join(", ", sorted));

내림차순 정렬

OrderByDescending은 선택한 키를 기준으로 큰 값부터 작은 값 순서로 정렬합니다.

오름차순으로 정렬한 뒤 뒤집는 대신 직접 사용하십시오. 의도가 명확하게 드러나고 한 번에 정렬할 수 있습니다.

using System;
using System.Linq;

int[] scores = { 70, 95, 60, 88 };
var ranked = scores.OrderByDescending(s => s);
Console.WriteLine(string.Join(", ", ranked));

속성으로 정렬하기

객체에서는 정렬 기준으로 사용할 속성을 선택합니다. OrderBy(p => p.Age)는 people을 가장 어린 사람부터 가장 나이 많은 사람 순으로 정렬합니다.

키는 숫자, 문자열, 날짜처럼 비교할 수 있는 모든 형식이나 IComparable을 구현하는 형식이 될 수 있습니다.

using System;
using System.Linq;
using System.Collections.Generic;

record P(string Name, int Age);
var people = new List<P> { new("Ana", 30), new("Bo", 22) };
var byAge = people.OrderBy(p => p.Age);
foreach (var p in byAge) Console.WriteLine(p.Name);

ThenBy를 사용한 보조 정렬

ThenBy는 동률을 해소하는 기준을 추가합니다. OrderBy를 사용한 뒤 기본 키가 같은 요소를 두 번째 키로 정렬합니다.

여러 수준으로 정렬하려면 ThenBy와 ThenByDescending 호출을 여러 번 연결할 수 있습니다.

using System;
using System.Linq;
using System.Collections.Generic;

record P(string Name, int Age);
var people = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var ordered = people.OrderBy(p => p.Age).ThenBy(p => p.Name);
foreach (var p in ordered) Console.WriteLine($"{p.Age} {p.Name}");

두 번째 OrderBy를 사용하면 안 되는 이유

OrderBy를 두 번 호출해도 동률을 해소하는 기준이 되지 않습니다. 두 번째 호출이 전체를 다시 정렬하면서 첫 번째 정렬 순서를 버리기 때문입니다.

여러 기준으로 정렬할 때는 처음 OrderBy를 사용한 뒤 항상 ThenBy를 사용하세요.

using System;
using System.Linq;
using System.Collections.Generic;

record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30) };
var wrong = ps.OrderBy(p => p.A).OrderBy(p => p.N);
foreach (var p in wrong) Console.WriteLine(p.N);

쿼리 구문의 orderby

쿼리 구문에는 orderby 절이 있습니다. 여러 키를 쉼표로 구분해 나열하고, 필요하면 descending을 함께 사용할 수 있습니다.

orderby p.Age, p.Name descending은 나이순으로 정렬한 다음, 나이가 같은 경우 이름을 역순으로 정렬합니다.

using System;
using System.Linq;
using System.Collections.Generic;

record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var q = from p in ps orderby p.A, p.N select p.N;
Console.WriteLine(string.Join(", ", q));

GroupBy를 사용한 그룹화

GroupBy는 같은 키를 공유하는 요소끼리 시퀀스를 그룹으로 나눕니다. 결과로 IGrouping<TKey, TElement>의 시퀀스를 반환합니다.

각 그룹은 Key를 제공하며, 그 그룹에 속한 요소를 순회할 수 있는 반복 가능한 객체이기도 합니다.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4, 5, 6 };
var groups = nums.GroupBy(n => n % 2 == 0 ? "even" : "odd");
foreach (var g in groups)
  Console.WriteLine($"{g.Key}: {string.Join(\",\", g)}");

그룹 키와 구성 요소

각 그룹의 Key는 해당 분할을 식별하고, 그룹을 순회하면 구성 요소가 반환됩니다. 그룹에 직접 Count()를 호출할 수도 있습니다.

이 방식으로 도수 분포표, 항목별 집계, 범주별 분석을 만들 수 있습니다.

using System;
using System.Linq;

string[] fruit = { "apple", "avocado", "banana", "cherry" };
var byLetter = fruit.GroupBy(f => f[0]);
foreach (var g in byLetter)
  Console.WriteLine($"{g.Key}: {g.Count()}");

그룹화 후 결과 만들기

일반적인 패턴은 GroupBy 다음에 Select를 사용해 각 그룹을 요약 객체로 변환하는 것입니다.

Key를 읽고 구성 요소를 집계합니다. 예를 들어 그룹별 개수나 합계를 계산할 수 있습니다.

using System;
using System.Linq;
using System.Collections.Generic;

record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("LA", 3), new("NY", 2) };
var totals = sales.GroupBy(s => s.City)
                  .Select(g => new { g.Key, Sum = g.Sum(x => x.Amt) });
foreach (var t in totals) Console.WriteLine($"{t.Key}={t.Sum}");

요소 선택기와 함께 사용하는 GroupBy

GroupBy에는 두 번째 람다를 받는 오버로드가 있습니다. 이 요소 선택기는 각 그룹을 어떤 키로 묶을지만 정하는 것이 아니라, 그룹에 저장할 내용을 변환합니다.

여기서는 도시별로 그룹화하되 금액만 저장합니다.

using System;
using System.Linq;
using System.Collections.Generic;

record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("NY", 2) };
var g = sales.GroupBy(s => s.City, s => s.Amt);
foreach (var grp in g)
  Console.WriteLine($"{grp.Key}: {string.Join(\",\", grp)}");

정렬과 그룹화는 지연됩니다

OrderBy와 GroupBy는 모두 지연 실행을 사용하므로 열거될 때 실행됩니다. 하지만 정렬과 그룹화는 첫 번째 요소를 반환하기 전에 전체 원본을 처리해야 한다는 점에 유의하세요.

따라서 Where와 달리 요소를 하나씩 처리하는 방식이 아니며, 첫 번째 순회에서 비용이 발생합니다.

using System;
using System.Linq;

int[] nums = { 3, 1, 2 };
var q = nums.OrderBy(n => n);
Console.WriteLine("Query built");
Console.WriteLine(string.Join(", ", q));

빠른 확인

여러 수준으로 정렬하는 방법을 생각해 보세요.

복습

OrderBy와 OrderByDescending은 키를 기준으로 정렬하고, ThenBy는 동률을 해소하는 기준을 추가합니다. 두 번째 OrderBy는 다시 정렬하므로 동률을 해소하는 기준이 아닙니다.

GroupBy는 Key와 구성 요소를 가진 IGrouping 객체로 나누며, 이를 요약 정보로 변환하는 경우가 많습니다. 두 연산 모두 지연되지만 원본 전체를 처리합니다. 다음으로 집계하고 결과를 구체화해 보겠습니다.

자주 묻는 질문

“OrderBy와 그룹화” 강의는 무료인가요?

네 — “OrderBy와 그룹화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“OrderBy와 그룹화”에서 뭘 배우나요?

결과를 정렬하고 그룹화합니다 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“OrderBy와 그룹화” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. WHERE와 필터링
  2. SELECT와 프로젝션
  3. OrderBy와 그룹화
  4. 집계와 ToList
← C# Academy(으)로 돌아가기