본문 바로가기
C#

C#] Lambda

by Fastlane 2021. 11. 5.
728x90
반응형

Lambda Expression

1. Expression Lambda

(parameter) => expression

class Program
{
    delegate int Calc(int a, int b); // 익명 메소드를 만들기 위한 델리게이트
 
    public static void Main(string[] args)
    {
        Calc c = (a, b) => a + b; // 익명 메소드를 람다식으로 구현
        Console.WriteLine("{0} + {1} = {2}", 1, 2, c(1, 2));
    }
}

 

2. Statement Lambda

(parameter) => {code, code, code};

class Program
{
    delegate void DoSomething();
 
    public static void Main(string[] args)
    {
        /* 문 형식의 람다식에서
         * 전달할 매개변수가 없으면 비워두면 됨 */
        DoSomething DoIt = () =>
        {
            Console.WriteLine("C#");
            Console.WriteLine("짱 재밌자너~");
        };
 
        DoIt();
    }
}

 

Func, Action, Predicate Delegate

 

Lambda Expression을 사용해서 익명 메소드를 사용하기 위해서 매번 별개의 대리자를 선언해야 한다. 

이 문제를 해결하기 위해서 MS는 .NET Framework에 Func와 Action 대리자를 미리 선언해 두었다. 

 

1) Func delegate

결과를 반환하는 메서드를 참조하기 위해 만들어졌다. 

class Program
{ 
    public static void Main(string[] args)
    {
        Func<int, int, int> c = (a, b) => a + b; // 익명 메소드를 람다식으로 구현
        Console.WriteLine("{0} + {1} = {2}", 1, 2, c(1, 2));
    }
}

2) Action delegate

void 메서드를 참조하기 위해 만들어졌다. 

 

class Program
{ 
    public static void Main(string[] args)
    {
        /* 문 형식의 람다식에서
         * 전달할 매개변수가 없으면 비워두면 됨 */
        Action DoIt = () =>
        {
            Console.WriteLine("C#");
            Console.WriteLine("짱 재밌자너~");
        };
 
        DoIt();
    }
}

 

3) Predicate delegate

Predicate<T>는 Func<T, bool>과 같다. 

 

List<T>.ForEach(Action<T>) Method

List<int> list = new List<int> {1, 2, 3, 4, 5};

foreach(var item in list)
{
	Console.WriteLine(item + " * 2 = " + (item * 2));
}

 //List<T>에 정의된 Foreach Action delegate 를 사용해서 아래와 같이 처리 가능하다. 
 
 list.ForEach((item) => {Console.WriteLine(item + " * 2 = " + (item * 2));});

List<T>.FindAll(Predicate<T>) Method

List<int> list = new List<int> {1, 2, 3, 4, 5};
List<int> evenList = new List<int>();

foreach (var item in list)
{
	if(item % 2 ==0)
    {
    	evenList.Add(item);
    }
}

//FindAll 메서드를 이용하면

List<int> evenList = list.FindAll((elem) => elem % 2 == 0);

Count<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)

Enumerable 타입의 확장메서드 Count를 사용하여 Func delegate를 넘겨줄 수 있다. 

            List<int> list = new List<int> { 1, 2, 3, 4, 5 };

            var totalCount = list.Count;

            var evenCount = list.Count((item) => item > 2);

            var evenCount2 = (from a in list
                              where a > 2
                              select a).Count();

Where<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)

List<string> fruits =
    new List<string> { "apple", "passionfruit", "banana", "mango",
                    "orange", "blueberry", "grape", "strawberry" };

IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6);

foreach (string fruit in query)
{
    Console.WriteLine(fruit);
}


Func<string, bool> isShorterSixLength = s => s.Length < 6;

//Func Delegate in LINQ Method Syntax
IEnumerable<string> query2 = fruits.Where(isShorterSixLength);

foreach (string fruit in query2)
{
    Console.WriteLine(fruit);
}

//Func Delegate in LINQ Query Syntax
IEnumerable<string> query3 = from s in fruits where isShorterSixLength(s) select s;

foreach (string fruit in query3)
{
    Console.WriteLine(fruit);
}

 

728x90
반응형

'C#' 카테고리의 다른 글

IEnumerable vs ICollection vs IList 차이점  (0) 2021.12.02
C#] LINQ 쿼리 키워드 let  (0) 2021.11.05
C#] Tuple types  (0) 2021.10.13
C#] EmailTemplate 활용하여 메일 발송하기  (0) 2021.09.28
C#] 메일발송 클래스  (0) 2021.09.09

댓글