NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 35-2. 람다식. (Lambda, IEnumerable, Action, Func)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 이전 글에 이어서 람다 식에 대해 좀 더 자세히 알아보죠~ 앞서 말한바와 같이 람다식과 익명 메소드는 아주 강력한 기능입니다. 아래 예제를 통해 하나씩 알아볼께요. 먼저 컬렉션에 사용할 클래스를 하나 생성합니다.

    using System;
     
    namespace LambdaWithIEnumerable
    {
        class NameCard
        {
            public string Name { get; set; }
            public string Phone { get; set; }
        }
    }
    

     

     

    NameCard는 A.O.A 맴버 정보를 나타내는 클래스입니다. 아래 예제에서 Main클래스를 추가하고 컬렉션을 초기화 합니다. 그리고, 람다식을 이용하여 필터링 하는 방법을 알아봅니다.

    using System;
    using System.Collections.Generic;
    using System.Linq;
     
    namespace LambdaWithIEnumerable
    {
        class NameCard { public string Name { get; set; } public string Phone { get; set; } }
        class MainApp
        {
            static void Main(string[] args)
            {
                List<NameCard> list = new List<NameCard>();
                list.Add(new NameCard() { Name = "초아", Phone = "010-1234-1234" });
                list.Add(new NameCard() { Name = "지민", Phone = "010-2345-2345" });
                list.Add(new NameCard() { Name = "유나", Phone = "010-3456-3456" });
                list.Add(new NameCard() { Name = "혜정", Phone = "010-4567-4567" });
                list.Add(new NameCard() { Name = "민아", Phone = "010-5678-5678" });
                list.Add(new NameCard() { Name = "설현", Phone = "010-6789-6789" });
                list.Add(new NameCard() { Name = "찬미", Phone = "010-7890-7890" });
                IEnumerable<NameCard> result = list.Where<NameCard>(namecard => namecard.Name.EndsWith("아"));
                foreach (NameCard namecard in result)
                    Console.WriteLine("{0} : {1}", namecard.Name, namecard.Phone);
                Console.ReadKey();
            }
        }
    }
    

     

     

    라인 2~3은 컬렉션과 컬렉션을 확장하는 링큐 네임스페이스가 추가되어야 합니다. 17라인의 컬렉션은 강력한 형식을 지정하는 제네릭입니다. 그리고, 28라인에서 이전에 알아본 확장 메소드가 정의되어 있는 링큐를 통해 컬렉션에서 필터를 구현하고 있습니다.

    MPNpeqx.jpg

     

     

    실행하면 28라인에서 Where 조건에 Predicate를 작성합니다. 여기에서는 람다식으로 표현하고 있는데요. 실행 해보면 Syntax가 다르더라도 문제를 발생시키진 않습니다. 이유는 Action, Func가 Delegate이고 Predicate에 있는 람다식은 Func와 대응되기 때문입니다. 이 응용 프로그램을 실행하면 '초아'와 '민아'가 결과로 표시됩니다. Func를 미리 정의한 후 실행해도 문제는 발생되지 않습니다.

    using System;
    using System.Collections.Generic;
    using System.Linq;
     
    namespace LambdaWithIEnumerable
    {
        class NameCard { public string Name { get; set; } public string Phone { get; set; } }
        class MainApp
        {
            static void Main(string[] args)
            {
                List<NameCard> list = new List<NameCard>();
                list.Add(new NameCard() { Name = "초아", Phone = "010-1234-1234" });
                list.Add(new NameCard() { Name = "지민", Phone = "010-2345-2345" });
                list.Add(new NameCard() { Name = "유나", Phone = "010-3456-3456" });
                list.Add(new NameCard() { Name = "혜정", Phone = "010-4567-4567" });
                list.Add(new NameCard() { Name = "민아", Phone = "010-5678-5678" });
                list.Add(new NameCard() { Name = "설현", Phone = "010-6789-6789" });
                list.Add(new NameCard() { Name = "찬미", Phone = "010-7890-7890" });
                Func<NameCard, bool> func = (namecard) => namecard.Name.EndsWith("아");
                IEnumerable<NameCard> result = //list.Where<NameCard>(namecard => namecard.Name.EndsWith("아"));                
                                               list.Where<NameCard>(func);
                foreach (NameCard namecard in result)
                    Console.WriteLine("{0} : {1}", namecard.Name, namecard.Phone);
                Console.ReadKey();
            }
        }
    }
    

     

     

    Action과 Func는 미리 정의되어 있는 대리자(Delegate)로 캡슐화되어 있습니다. 따라서, 사용자 지정 대리자를 선언하지 않고 매개 변수로 전달할 수 있습니다. Action과 Func가 다른점은 반환 값의 유무 하나뿐입니다. 아래 예제는 반환 값이 없는 대리자인 Action에 대한 예제입니다.

    using System;
    
    namespace ActionTest
    {
        class MainApp
        {
            static void Main(string[] args)
            {
                Action act1 = () => Console.WriteLine("Action()");
                act1();
                int result = 0;
                Action<int> act2 = (x) => result = x * x;
                act2(3);
                Console.WriteLine("result : {0}", result);
                Action<double, double> act3 = (x, y) => { double pi = x / y; Console.WriteLine("Action<T1, T2>({0}, {1}) : {2}", x, y, pi); };
                act3(22.0, 7.0);
                Console.ReadKey();
            }
        }
    }
    

     

     

    Action은 최대 16개까지 인자를 받을 수 있습니다. 더 많은 인자를 수용하려면 직접 대리자를 선언하거나 람다식을 이용해야 합니다. 이는 Func도 동일합니다. 하지만, Action보다 하나 많은 17개의 인자를 받습니다. 마지막에 오는 인자는 반환 형식을 나타내므로 결국 Action과 같은 수의 인자를 처리할 수 있습니다.

    아래는 Func에 대한 예제입니다.

    using System;
    
    namespace FuncTest
    {
        class MainApp
        {
            static void Main(string[] args)
            {
                Func<int> func1 = () => 10;
                Console.WriteLine("func1() : {0}", func1());
                Func<int, int> func2 = (x) => x * 2;
                Console.WriteLine("func2(4) : {0}", func2(4));
                Func<double, double, double> func3 = (x, y) => x / y;
                Console.WriteLine("func3(22/7) : {0}", func3(22, 7));
                Console.ReadKey();
            }
        }
    }
    

     

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.