본문 바로가기
C#/Enumerable (Linq)

[C#] Linq (람다식 메서드)

by 스누누피 2024. 11. 5.

최근 수정: 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