집계와 ToList
개수를 세고 합산한 뒤 구체화합니다
집계와 ToList은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
요소 개수 세기
Count는 시퀀스의 요소 개수를 반환합니다. 조건자를 지정하면 조건에 맞는 요소만 셉니다.
이 연산은 열거를 강제로 실행하므로 합계를 계산하기 위해 전체 시퀀스를 순회합니다. 즉, 집계 연산입니다.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5 };
Console.WriteLine(nums.Count());
Console.WriteLine(nums.Count(n => n > 2));값 더하기
Sum은 숫자 값을 모두 더합니다. 숫자 시퀀스에 사용하면 요소를 더하고, 선택기를 사용하면 각 요소에서 변환된 값을 더합니다.
원본 또는 선택기 결과와 같은 숫자 형식으로 반환합니다.
using System;
using System.Linq;
using System.Collections.Generic;
record Order(int Qty, decimal Price);
var orders = new List<Order> { new(2, 5m), new(3, 4m) };
decimal total = orders.Sum(o => o.Qty * o.Price);
Console.WriteLine(total);값의 평균 구하기
Average는 산술 평균을 계산합니다. Sum과 마찬가지로 선택기를 선택적으로 받을 수 있습니다.
원본이 정수인 경우에도 결과는 부동 소수점 형식이 됩니다. 예를 들어 double 형식이므로 나눗셈에서 정밀도가 손실되지 않습니다.
using System;
using System.Linq;
int[] scores = { 80, 90, 100 };
double avg = scores.Average();
Console.WriteLine(avg);최솟값과 최댓값
Min과 Max는 가장 작은 값과 가장 큰 값을 반환합니다. 선택기를 사용하면 변환된 키를 기준으로 값을 줄여 나갑니다.
최신 .NET에서는 MaxBy와 MinBy가 키 값만 반환하는 것이 아니라 최댓값 또는 최솟값에 해당하는 전체 요소를 반환합니다.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var oldest = ps.MaxBy(p => p.Age);
Console.WriteLine(oldest!.Name);빈 시퀀스에서 주의할 점
빈 시퀀스에서 값 형식에 대해 Average, Min, Max를 사용하면 InvalidOperationException이 발생합니다. Sum은 0을 반환하고 Count도 0을 반환합니다.
비어 있을 수 있는 데이터를 평균 내기 전에는 Any()로 확인하거나 DefaultIfEmpty를 사용하세요.
using System;
using System.Linq;
int[] empty = Array.Empty<int>();
double avg = empty.DefaultIfEmpty(0).Average();
Console.WriteLine(avg);사용자 지정 누적을 위한 Aggregate
Aggregate는 누적 함수를 사용해 시퀀스를 하나의 값으로 누적합니다. Sum을 비롯한 여러 연산의 일반적인 형태입니다.
초깃값을 제공하고 각 요소를 실행 중인 결과에 결합할 수 있어 곱셈, 문자열 연결 또는 사용자 지정 로직에 유용합니다.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4 };
int product = nums.Aggregate(1, (acc, n) => acc * n);
Console.WriteLine(product);ToList로 결과 구체화하기
ToList는 쿼리를 즉시 실행하고 결과를 List<T>에 복사합니다. 이렇게 하면 의도적으로 지연 실행이 중단됩니다.
안정적인 시점의 복사본을 만들거나, 비용이 큰 처리 과정을 다시 실행하지 않거나, 인덱싱 및 Count 속성과 같은 목록 기능을 사용하려면 활용하세요.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4 };
var evens = nums.Where(n => n % 2 == 0).ToList();
evens.Add(6);
Console.WriteLine(string.Join(", ", evens));ToArray와 ToDictionary
관련 결과 구체화 메서드로 고정 크기 배열을 만드는 ToArray와 키를 기반으로 조회하는 ToDictionary가 있습니다.
ToDictionary는 키 선택기와 선택적인 값 선택기를 받으며, 두 요소가 같은 키를 생성하면 예외를 발생시킵니다.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var byName = ps.ToDictionary(p => p.Name, p => p.Age);
Console.WriteLine(byName["Ana"]);결과를 구체화하는 이유
지연된 쿼리는 순회할 때마다 다시 실행됩니다. 처리 과정에 비용이 많이 들거나 변경되는 원본을 읽는 경우, 이러한 반복으로 버그와 성능 저하가 발생합니다.
ToList를 한 번 호출하면 결과가 저장되므로 이후에는 적은 비용으로 일관되게 읽을 수 있습니다.
using System;
using System.Linq;
int runs = 0;
int[] nums = { 1, 2, 3 };
var list = nums.Select(n => { runs++; return n; }).ToList();
foreach (var _ in list) { }
foreach (var _ in list) { }
Console.WriteLine(runs);First, Single, Any 사용하기
요소 연산자도 실행을 강제합니다. First는 첫 번째 일치 항목을 반환하고, 일치하는 항목이 없으면 예외를 발생시킵니다. FirstOrDefault는 대신 기본값을 반환하고, Single은 정확히 하나의 항목을 요구합니다.
Any는 모든 항목을 세지 않고 시퀀스에 일치하는 항목이 있는지 알려 줍니다.
using System;
using System.Linq;
int[] nums = { 3, 8, 5, 12 };
int firstBig = nums.First(n => n > 7);
bool hasOdd = nums.Any(n => n % 2 == 1);
Console.WriteLine($"{firstBig} {hasOdd}");전체 처리 과정
실제 쿼리는 필터링, 결과 변환, 정렬, 집계를 연결하며, 마지막에 결과 구체화 메서드를 사용하는 경우가 많습니다.
위에서 아래로 읽으세요. 필터링한 다음 형태를 정하고, 정렬한 뒤 수집합니다. 마지막 ToList가 전체 처리 과정을 한 번 실행합니다.
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", 9) };
var top = sales.Where(s => s.Amt > 4)
.OrderByDescending(s => s.Amt)
.Select(s => s.City)
.ToList();
Console.WriteLine(string.Join(", ", top));빠른 확인
지연 실행과 결과 구체화가 어떻게 동작하는지 생각해 보세요.
복습
집계 연산은 시퀀스를 하나의 값으로 줄입니다. Count, Sum, Average, Min과 Max, MinBy와 MaxBy, 그리고 일반적인 형태인 Aggregate가 이에 해당합니다. 이러한 연산은 실행을 강제하며 빈 원본에서 예외를 발생시킬 수 있습니다.
ToList, ToArray, ToDictionary는 결과를 구체화하여 지연 실행을 중단하므로 비용이 큰 처리 과정도 한 번만 실행됩니다. 이것으로 LINQ의 필터링 및 결과 변환 도구를 모두 살펴보았습니다.
자주 묻는 질문
“집계와 ToList” 강의는 무료인가요?
네 — “집계와 ToList” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“집계와 ToList”에서 뭘 배우나요?
개수를 세고 합산한 뒤 구체화합니다 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“집계와 ToList” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- WHERE와 필터링
- SELECT와 프로젝션
- OrderBy와 그룹화
- 집계와 ToList