C# · 심층 가이드
C# 컬렉션 완전 정리
LINQ 지연 실행을 축으로 map과 filter, 그룹화, 빈도표, chunk, sliding window까지 C# 컬렉션 처리 스무 가지를 실행 가능한 조각으로 다룹니다.
C#의 컬렉션 코드는 LINQ를 아는지 모르는지에 따라 완전히 다르게 생깁니다. 반복문으로 열 줄 걸리던 처리가 Select와 Where 두 번의 호출로 줄어드는데, 대신 지연 실행이라는 새로운 사고방식이 따라붙습니다. 쿼리를 만든 시점이 아니라 결과를 열거하는 시점에 계산이 벌어진다는 점, 그리고 반환값이 배열이 아니라 IEnumerable이라는 점이 이 절의 전제입니다. 자바스크립트의 map이나 파이썬의 리스트 컴프리헨션처럼 곧바로 리스트가 나온다고 생각하면 뒤에서 계속 어긋납니다.
map 변환, filter 필터링, reduce 합계는 나머지 예제의 문법적 바탕이라 먼저 읽는 편이 좋습니다. 여기서 groupBy 구현과 빈도표 만들기로 넘어가면 키로 묶는 작업이 두 갈래로 갈리는 게 보이고, chunk 나누기와 sliding window는 같은 시퀀스를 겹치지 않게 자르느냐 겹쳐서 훑느냐의 차이입니다. partition 나누기는 조건 하나로 두 덩어리를 만드는 형태라 filter와 이어 보면 이해가 빠릅니다.
지연 실행이 무는 대표적인 함정이 두 번 열거입니다. Where 결과를 변수에 담아 두고 Count()와 foreach에 각각 쓰면 원본을 두 번 훑습니다. 원본이 데이터베이스 쿼리나 파일 스트림이면 비용이 그대로 두 배가 되고, 중간에 원본이 바뀌면 결과까지 달라집니다. 확정하고 싶은 지점에서 ToList로 고정하는 습관이 필요합니다. 대소문자 무시 중복 제거에서는 기본 비교자가 대소문자를 구분하므로 StringComparer를 명시해 넘겨야 합니다.
01map 변환
C#에서 map 변환 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// map 변환
using System;
using System.Linq;
var items = new[] { 1, 2, 3, 1 };
Console.WriteLine(string.Join(", ", items.Select(value => value * 2)));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
02filter 필터링
C#에서 filter 필터링 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// filter 필터링
using System;
using System.Linq;
var words = new[] { "cs", "dotnet", "cs", "rust" };
Console.WriteLine(string.Join(", ", words.Distinct()));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
03reduce 합계
C#에서 reduce 합계 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// reduce 합계
using System;
using System.Linq;
var items = new[] { 1, 2, 3, 3 };
Console.WriteLine(string.Join(", ", items.Select(value => value * 2)));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
04첫 요소 찾기
C#에서 첫 요소 찾기 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// 첫 요소 찾기
using System;
using System.Linq;
var words = new[] { "cs", "dotnet", "cs", "rust" };
Console.WriteLine(string.Join(", ", words.Distinct()));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
05Set 중복 제거
C#에서 Set 중복 제거 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// Set 중복 제거
using System;
using System.Linq;
var items = new[] { 1, 2, 3, 5 };
Console.WriteLine(string.Join(", ", items.Select(value => value * 2)));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
06단어 수 세기
C#에서 단어 수 세기 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// 단어 수 세기
using System;
using System.Linq;
var words = new[] { "cs", "dotnet", "cs", "rust" };
Console.WriteLine(string.Join(", ", words.Distinct()));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
07스택 구현
C#에서 스택 구현 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// 스택 구현
using System;
using System.Linq;
var items = new[] { 1, 2, 3, 7 };
Console.WriteLine(string.Join(", ", items.Select(value => value * 2)));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
08큐 구현
C#에서 큐 구현 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// 큐 구현
using System;
using System.Linq;
var words = new[] { "cs", "dotnet", "cs", "rust" };
Console.WriteLine(string.Join(", ", words.Distinct()));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
092차원 배열 합계
C#에서 2차원 배열 합계 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// 2차원 배열 합계
using System;
using System.Linq;
var items = new[] { 1, 2, 3, 9 };
Console.WriteLine(string.Join(", ", items.Select(value => value * 2)));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
10groupBy 구현
C#에서 groupBy 구현 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// groupBy 구현
using System;
using System.Linq;
var words = new[] { "cs", "dotnet", "cs", "rust" };
Console.WriteLine(string.Join(", ", words.Distinct()));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
11flatten 펼치기
C#에서 flatten 펼치기 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// flatten 펼치기
using System;
using System.Linq;
var items = new[] { 1, 2, 3, 11 };
Console.WriteLine(string.Join(", ", items.Select(value => value * 2)));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
12zip 묶기
C#에서 zip 묶기 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// zip 묶기
using System;
using System.Linq;
var words = new[] { "cs", "dotnet", "cs", "rust" };
Console.WriteLine(string.Join(", ", words.Distinct()));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
13chunk 나누기
C#에서 chunk 나누기 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// chunk 나누기
using System;
using System.Linq;
var items = new[] { 1, 2, 3, 13 };
Console.WriteLine(string.Join(", ", items.Select(value => value * 2)));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
14key 기준 정렬
C#에서 key 기준 정렬 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// key 기준 정렬
using System;
using System.Linq;
var words = new[] { "cs", "dotnet", "cs", "rust" };
Console.WriteLine(string.Join(", ", words.Distinct()));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
15빈도표 만들기
C#에서 빈도표 만들기 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// 빈도표 만들기
using System;
using System.Linq;
var items = new[] { 1, 2, 3, 15 };
Console.WriteLine(string.Join(", ", items.Select(value => value * 2)));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
16대소문자 무시 중복 제거
C#에서 대소문자 무시 중복 제거 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// 대소문자 무시 중복 제거
using System;
using System.Linq;
var words = new[] { "cs", "dotnet", "cs", "rust" };
Console.WriteLine(string.Join(", ", words.Distinct()));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
17sliding window
C#에서 sliding window 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// sliding window
using System;
using System.Linq;
var items = new[] { 1, 2, 3, 17 };
Console.WriteLine(string.Join(", ", items.Select(value => value * 2)));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
18pair 목록을 맵으로 변환
C#에서 pair 목록을 맵으로 변환 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// pair 목록을 맵으로 변환
using System;
using System.Linq;
var words = new[] { "cs", "dotnet", "cs", "rust" };
Console.WriteLine(string.Join(", ", words.Distinct()));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
19reverse 복사
C#에서 reverse 복사 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// reverse 복사
using System;
using System.Linq;
var items = new[] { 1, 2, 3, 19 };
Console.WriteLine(string.Join(", ", items.Select(value => value * 2)));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
20partition 나누기
C#에서 partition 나누기 개념을 코드로 빠르게 확인하는 컬렉션 예제입니다.
C# code
// partition 나누기
using System;
using System.Linq;
var words = new[] { "cs", "dotnet", "cs", "rust" };
Console.WriteLine(string.Join(", ", words.Distinct()));컬렉션 연산은 원본을 바꾸는지 새 값을 만드는지 꼭 함께 확인하세요.
정렬, 필터, 추가 연산이 원본을 바꾸는지 혼동하면 버그로 이어지기 쉽습니다.
정리하며
- LINQ 쿼리는 열거되는 순간 계산되므로 결과를 담은 변수가 곧 데이터는 아닙니다
- 같은 시퀀스를 두 번 이상 쓸 자리에서는
ToList로 한 번만 계산되게 고정합니다 - 문자열 키 비교는
StringComparer를 넘겨 대소문자 규칙을 명시적으로 정합니다 - 키로 묶는 작업은 그룹 목록이 필요한지 개수만 필요한지에 따라 다른 도구를 씁니다
더 깊이 들어가고 싶다면 C# 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.