최근 수정: 2024.11.05
Enumerable 클래스 중 람다식을 사용하는 메서드를 기록하는 곳입니다.
주요메서드
- Select() : 각 요소를 요청에 맞게 만들어 새로운 시퀀스를 만들어 준다.
예를 들면 각 요소의 타입을 변경한다던지, 특정 프로퍼티만 추출한다던지, 각 요소에 연산을 한다던지 등등
string[] intStrs = { "123", "456", "789" };
int[] answer = intStrs.Select(s => int.Parse(s)).ToArray(); // 각 요소를 정수로 바꾸기
foreach (int i in answer)
Console.Write(i + " "); // 123 456 789
- Where() : 특정 조선을 만족하는 요소만 선택해서 새로운 시퀀스를 만든다.
var sequence = Enumerable.Range(1, 9);
var even = sequence.Where(num => num % 2 == 0);
foreach(var num in even)
{
Console.Write(num); // 2468
}
※ 인덱스 활용
Select(), Where()은 두번째 매개변수로 인덱스를 가진다. 이를 활용하면 다양한 코드를 작성할 수 있다.
string[] arr = { "a", "b", "c", "d", "e" };
string[] whereArr = arr.Where((w, index) => index % 2 == 0).ToArray();
foreach (string str in whereArr)
Console.Write(str + " "); // a c e
int[] selectArr = arr.Select((s, index) => index).ToArray();
foreach(int i in selectArr)
Console.Write(i + " "); // 0 1 2 3 4
- OrderBy() : 시퀀스의 요소를 오름차순으로 정렬한다.
- OrderByDescending() : 시퀀스의 요소를 내림차순으로 정렬한다.
int[] num_list = { 12, 4, 15, 46, 38, 1, 14, 56, 32, 10 };
int[] asc_num_list = num_list.OrderBy(o => o).ToArray();
int[] desc_num_list = num_list.OrderByDescending(o => o).ToArray();
foreach (int i in asc_num_list)
Console.Write(i + " "); // 1 4 10 12 14 15 32 38 46 56
foreach (int i in desc_num_list)
Console.Write(i + " "); // 56 46 38 32 15 14 12 10 4 1
- Aggregate() : 각 요소를 누적해서 연산을 처리해서 반환한다.
(현재값, 연산할 값) => 연산, 이런식으로 사용이 가능하다.
첫번째 매개변수로 초기값을 줄수도 있다. 없으면 시퀀스의 첫번째 요소가 초기값이 된다.
int[] num_list = { 1, 2, 3, 4, 5 };
int result = num_list.Aggregate((cur, next) => cur * next);
Console.WriteLine(result); // 120
// 초기값 0, 홀수만 더하기
result = num_list.Aggregate(0, (cur, next) => (next%2==1) ? cur+next : cur);
Console.WriteLine(result); // 9
- GroupBy() : 그룹을 지어 key-value형태로 시퀀스를 반환한다.
string[] strArr = { "a", "bc", "d", "efg", "hi" };
var arr = strArr.GroupBy(g => g.Length); // 각 요소의 길이를 기준으로 그룹
// index : key : value
// 0 : 1 : [ "a", "d" ]
// 1 : 2 : [ "bc", "hi" ]
// 2 : 3 : [ "efg" ]
// 각 요소의 key값을 출력
Console.WriteLine(string.Join(",", arr.Select(s => s.Key))); // 1,2,3
- Zip() : 두 시퀀스를 이용하여 하나의 결과 시퀀스를 반환해준다.
시퀀스1.Zip(시퀀스2, (시퀀스1요소, 시퀀스2요소) => 계산식) : 계산식을 통한 결과값의 시퀀스를 반환
int[] a = { 1, 2, 3, 4 };
int[] b = { -3, -1, 0, 2 };
// a, b 배열의 요소들을 순서대로 곱해서 반환
int[] answer = a.Zip(b, (n1, n2) => n1 * n2).ToArray();
Console.WriteLine(string.Join(",", answer)); // -3,-2,0,8
Console.WriteLine(answer.Sum()); // 3
'C# > Enumerable (Linq)' 카테고리의 다른 글
[C#] Enumerable.SelectMany() 메서드 (1) | 2025.01.07 |
---|---|
[C#] OfType<T>() vs CAST<T>() (0) | 2024.12.19 |
[C#] Enumerable.Union() 메서드 (0) | 2024.12.13 |
[C#] Enumerable.FirstOrDefault() 메서드 (0) | 2024.12.10 |
[C#] Linq (Enumerable 클래스) (0) | 2024.07.23 |