0323 익명 함수

2021. 3. 23. 16:31C#/수업내용

메서드를 매개 변수로 전달할 수 있다.

람다 식을 사용한다.

 

람다 식 => 람다 선언 연산자를 사용하여 본문에서 람다의 매개 변수 목록을 구분

식에 {} 붙어있으면 문 람다 ;

 

대리자+익명함수(lambda)

 

public App() 
        {
            Console.WriteLine("App");
            Action sayHello = this.SayHello;
            Action sayhello = () => { Console.WriteLine("Hello Word "); };
            
            //대리자 초기화
            Action<string> SendMessage = this.SendMessage;
            Action<string> sendMessage = (message) => { Console.WriteLine(message); };
            //대리자 호출
            sendMessage("안녕하세요");
            SendMessage("안녕하세요");
        }
        private void SayHello() 
        {
            Console.WriteLine("Hello World");
        }
        private void SendMessage(string message) 
        {
            Console.WriteLine(message);
        }
public class App
    {
        public App() 
        {
            Func<int, int> multiply = (x) =>
             {
                 return x * x;
             };
            int result = multiply(5);
            Console.WriteLine(result);
        }
    }

 

무명 메서드/익명 메서드

public class App
    {
        public App() 
        {
            Func<string, int, bool> checkStringLength = (message, length) =>
              {
                  return message.Length > length;
              };
            bool result = checkStringLength("Hello World", 5);
            Console.WriteLine(result);

            Action Hi = () =>
            {
                Console.WriteLine("Hello");
                Console.WriteLine("World");
            };
            Hi();
        }
    }

 

Linq 쿼리

배열, 열거식, 클래스 등으로부터 데이터를 편리하게 추출하고 가공하기 위해 사용한다.

public class App
    {
        public App() 
        {
            List<string> items = new List<string>();
            items.Add("장검");
            items.Add("도끼");
            items.Add("활");
            items.Add("단검");

            items.Where(p => p == "단검");
            IEnumerable<string> foundNames = items.Where(p => p == "단검");
            foreach (string name in foundNames)
            {
                Console.WriteLine(name);
                break;
            }
            string foundItems=items.Find(x => x == "단검");
            Console.WriteLine("found: {0}",foundItems);

        }
    }

 

 

public class App
    {
        public App() 
        {
            List<Item> items = new List<Item>();
            //Item 객체 생성
            Item item1 = new Item("이루실의 직검");
            Item item2 = new Item("빛의 탈리스만");
            Item item3 = new Item("부러진 직검");
            Item item4 = new Item("벌어진 검");

            //컬렉션 추가
            items.Add(item1);
            items.Add(item2);
            items.Add(item3);
            items.Add(item4);

            //컬렉션에서 item객체의 이름이 xxx인 것을 찾으시오
            //Linq: find+lambda
            items.Find(p => p == item1);
            foreach (Item item in items) 
            {
                Console.WriteLine(item);
            }

            //만약에 같은 이름의 요소가 있다면 모두 찾아서 출력하세요.
            //Linq: Where+lambda
            items.Where(p => p == item1);
            IEnumerable<Item> foundNames = items.Where(p => p == item1);
            foreach (Item item in items)
            {
                Console.WriteLine(item);
                break;
            }
        }
    }
public class App
    {
        public class Book 
        {
            public string ID { get; set; }
            public string Title { get; set; }
        }
        public App() 
        {
            List<Book> books = new List<Book>();

            books.Add(new Book() { ID = "bk109", Title = "어린왕자" });
            
            books.Find(delegate (Book book)
                {
                    return book.ID == "bk109";
                });

            Book foundBook = books.Find((book) => book.ID == "bk109");
            if (foundBook != null) 
            {
                Console.WriteLine("{0},{1}", foundBook.ID, foundBook.Title);
            }
        }
    }

★★★★★★★

public class App{

        public App()
        {
            Treasure[] treasures;
            treasures = new Treasure[12];
            Treasure treasure1 = new Treasure("문지기 유령의 오른쪽 뿔", eGrade.Common, 7);
            Treasure treasure2 = new Treasure("어린 순례자의 장난감 새총", eGrade.Rare, 3);
            Treasure treasure3 = new Treasure("행복한 곰젤리의 숨겨둔 사탕", eGrade.Common, 7);
            Treasure treasure4 = new Treasure("왕자 곰젤리의 젤리시계", eGrade.Common, 2);
            Treasure treasure5 = new Treasure("나이든 순례자의 무공비급", eGrade.Epic, 7);
            Treasure treasure6 = new Treasure("작은 뿔꿈틀이의 방어용 점액", eGrade.Epic, 2);
            Treasure treasure7 = new Treasure("무녀맛 쿠키의 영험한 부적", eGrade.Rare, 4);
            Treasure treasure8 = new Treasure("골카론의 날카로운 낫", eGrade.Rare, 5);
            Treasure treasure9 = new Treasure("아이스크림 상인의 신기루 아이스크림", eGrade.Rare, 5);
            Treasure treasure10 = new Treasure("설탕백조의 샤이닝 깃털", eGrade.Epic, 2);
            Treasure treasure11 = new Treasure("치즈볼새의 동전 주머니", eGrade.Common, 2);
            Treasure treasure12 = new Treasure("순례자 마을 촌장의 횃불", eGrade.Epic, 3);

            treasures[0] = treasure1;
            treasures[1] = treasure2;
            treasures[2] = treasure3;
            treasures[3] = treasure4;
            treasures[4] = treasure5;
            treasures[5] = treasure6;
            treasures[6] = treasure7;
            treasures[7] = treasure8;
            treasures[8] = treasure9;
            treasures[9] = treasure10;
            treasures[10] = treasure11;
            treasures[11] = treasure12;

            Console.WriteLine(treasures.Length);

            treasures.Sort(CompareByGrade);

        }
        private eGrade CompareByGrade(eGrade epic, eGrade common) 
        {
            int grade = 0.CompareTo(2);
            if (grade == 0)
            {
                return eGrade.Epic;
            }
            else 
            {
                if(grade ==1)
                {
                    return eGrade.Rare;
                }
                return eGrade.Common;
            }
        }
    }
public enum eGrade {
    Epic, Rare, Common}
    public class Treasure
    {
        public string itemName;
        public eGrade grade;
        public int level;
        public Treasure(string name, eGrade grade, int level) 
        {
            this.itemName = name;
            this.grade = grade;
            this.level = level;
        }
    }