프로그래밍/(도서)프랙티컬 C#

[C#] 프랙티컬 C# - 3.1 람다식

Victory_HA 2022. 3. 31. 22:35

람다 연산자

  • 람다 식에서 람다 연산자 =>의 왼쪽은 "매개변수", 오른쪽은 "람다 본문"으로 구분하여 사용합니다.

Step0 (가장 긴 코드)

  • 람다식이 judge변수에 대입되고, 그 judge변수가 Count 메서드의 인수에 전달된다.
Predict<int> judge = 
    //아래 부분이 람다식. judge변수에 대입한다.
    (int n) => {
        if(n % 2 == 0)
            return true;
        else
            return false;
    }

Step1

  • Step0의 judge변수를 없애고 식을 직접 Count메서드의 인수로 지정하겠습니다.
var count = Count(numbers,  
    (int n) => {
        if(n % 2 == 0)
            return true;
        else
            return false;
    }
);

Step2

  • 다음 두 가지 이유로 if문을 없앨 수 있습니다.
    • return의 오른쪽에 식을 쓸 수 있다.
    • n % 2 == 0은 식이며 bool형의 값을 가진다. (식이 성립하면 true, 성립하지 않으면 false)
var count = Count(numbers, (int n) => {return n % 2 == 0; });

Step3

  • 람다식에서 {}가 하나의 명령문을 포함할 때는 {}와 return을 생략할 수 있습니다.
var count = Count(numbers, (int n) => n % 2 == 0);

Step4

  • 람다식에서는인수의 형을 생략할 수 있습니다.
  • 컴파일러가 형을 제대로 추론해주므로 형을 명시하지 않아도 됩니다.
var count = Count(numbers, (n) => n % 2 == 0);

Step5

  • 인수가 한개인 경우 ()를 생략할 수 있습니다.
    var count = Count(numbers, n => n % 2 == 0);

람다식을 사용한 예

홀수의 개수를 센다

var count = Count(numbers, n => n % 2 == 1);

5이상인 개수를 센다.

var count = Count(numbers, n => n >= 5);

숫자에 1이 포한된 수의 개수를 센다.

var count = Count(numbers, n => n.ToString().Contains('1') );

List와 람다식

  • 다음 리스트가 있다고 합시다.
    var list = new List<string>
    {
      "soeul", "New Delhi", "bangkok", "joenju", "Daegu", "Berlin"
    };
    Exists
  • 해당 조건의 요소가 있는지 확인합니다.
  • list의 요소들이 순차로 s에 대입되고, 람다식 본문에서 s[0]이 'A'인지 판정합니다.
    • s[0]은 요소의 첫 글자를 의미합니다.
      var exists = list.Exists(s => s[0] == 'A');

Find

  • 람다식의 조건과 일치하는 요소를 검색 -> 일치하는 조건들 중 첫번째 요소를 반환합니다.
var name = list.Find(s => s.Length == 6);
Console.WriteLine(name);

FindIndex

  • Find와 비슷하게, 일치하는 조건들 중 첫번째 요소의 인덱스를 반환합니다.
    var index = list.FindIndex(s => s.Length == "joenju");
    Console.WriteLine(index);

FindAll

  • 조건에 일치하는 모든 요소를 반환합니다.
    var names = list.FindAll(s => s.Length <= 5);
    foreach(var s in names)
      Console.WriteLine(s);

RemoveAll

  • 조건에 일치하는 모든 요소를 삭제합니다.
  • 삭제한 요소의 개수를 반환합니다.
var removedCount = list.RemoveAll(s => s.Contains("s"));
Console.WriteLine(removedCount);

ForEach

  • 인수로 지정한 처리 내용을 리스트의 각 요소에 순차로 실행합니다.
  • ForEach 메서드는 Action 델리게이트를 인수로 받아들입니다.
  • 이제까지 살펴본 예는 Predicate 델리게이트를 인수로 받는 메서드였습니다.
  • Predicate 델리게이트 : 반환값이 bool, 매개변수가 1개 입니다.
    • 어떤 기준을 만족하는지를 판단하는 메서드를 나타냅니다.
  • Action델리게이트 : 반환값이 void, 매개변수가 1개 입니다.
list.ForEach(s => Console.WriteLine(s));

ConvertAll

  • 모든 요소를 형 변환 후 변환된 요소가 저장된 리스트를 반환합니다.
  • 원본 list는 변화하지 않습니다.
    var upperList = list.ConvertAll(x => x.ToUpper());