본문 바로가기

   
Programming/LINQ

람다, Func, Action, OrderBy, Single, Orderby

반응형



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

//Array가 제공해주는 Find() 메서드 이용하면서 최종(M4) 람다식 이용하는 방법

//M5(list);//쿼리 연산자 사용

namespace ConsoleEx

{

       class Ex07_Lambda

       {

             static void Main(string[] args)

             {

                    //Employee 배열

                    //Employee[] list = new Employee[5];

                    //list[0] = new Employee();// 이부분에서 실제 Employee 객체 생성

 

 

                    //int[] ns = new int[5] { 1, 2, 3, 4, 5 };

                    //위에 것을 아래부분에서 배열로 만들면서,

                    //동시에 실제 Employee 객체를 생성함. , 객체 초기화까지 병행하면서..

                    Employee[] list = new Employee[5] { new Employee { ID = "A001", Name = "홍길동", Age = 25 }, new Employee { ID = "A002", Name = "아무게", Age = 25 }, new Employee { ID = "A003", Name = "하하하", Age = 25 }, new Employee { ID = "A004", Name = "호호호", Age = 25 }, new Employee { ID = "A005", Name = "테스트", Age = 25 } };

 

                    //요구사항] list에서 ID "A003" 검색 => 이름?

                    //  LINQ의 구성

                    //  1. 확장 메서드(쿼리 연산자) + 람다식 : C#표현에 가까움

                    //  2. 쿼리표현식 : SQL표현식과 유사

 

 

                    // M1(list);//가장 전형적인 방법 = for/foreach 사용

                    // M2(list);//Array가 제공하는 메서드(Find)

                    // M3(list);//Array가 제공하는 메서드사용(익명메서드)

                    // M4(list);//Array가 제공하는 메서드사용(람다식이용)

                    // M5(list);//쿼리 연산중에서 (.Where) 사용

                    M6(list);//쿼리 표현식

 

 

             }

 

             private static void M6(Employee[] list)

             {

                    //select top 1 * from list where id = "A003"; 와 비슷한 표현방식으로 아래와같이 가능

                    Employee result = (from e in list where e.ID == "A003" select e).First();

                    Console.WriteLine(result.Name);

             }

 

             private static void M5(Employee[] list)

             {

                    //쿼리 연산자 : SQL문과 유사하게 이름을 지어놓은 확장메서드

                    //객체 메서드 .Where, .Find(정적메서드)

                    Employee result = list.Where(e => e.ID == "A003").First();

                    Console.WriteLine(result.Name);

 

             }

 

             private static void M4(Employee[] list)

             {

                    //M3()의 버전업

                    // 익명메서드 -> 람다식으로 변환 가능

                    // , 람다식이라도 델리게이트 선언과 필요할경우 원본 메서드는 미리 구현 해놔야 함

                    Employee result = Array.Find(list, e => e.ID == "A003");

                    Console.WriteLine(result.Name);

             }

 

             private static void M3(Employee[] list)

             {

                    //M2()의 버전업; Find메서드의 인자에 익명 메서드 이용(다른곳에서 사용 안하고 여기서만 사용할테니까..)

                    Employee result = Array.Find(list, delegate(Employee e) { return e.ID == "A003"; });

                    Console.WriteLine(result.Name);

             }

 

             //Array 제네릭 메서드 이용

             private static void M2(Employee[] list)

             {

                    //Array 제네릭 메서드 이용

                    //.Find(배열명, 미리 구현해놓은 메서드이름)

                    //<> 생략가능

                    //Predicate(형식, 약속..) -> 메서드 생성

                    //배열 list에서 FindPredicate를 인자로 넘기면서 일치하는것 찾으면 True되는 동시에, 종료되고,

                    //  그 해당 Employee 객체를 rusult에 리턴해줌.

                    Employee result = Array.Find(list, FindPredicate);

                    Console.WriteLine(result.Name);

 

 

             }

             //위에서 Predicate로 사용할 메서드 선언

             public static bool FindPredicate(Employee e)

             {

                    return e.ID == "A003";

             }

 

 

 

             private static void M1(Employee[] list)

             {

                    for (int i = 0; i < list.Length; i++)

                    {

                           if (list[i].ID == "A003")

                           {

                                 Console.WriteLine(list[i].Name);

                                 return;

                           }

                    }

             }

       }

 

       //직원 클래스

       class Employee

       {

             public string ID { get; set; }

             public string Name { get; set; }

             public int Age { get; set; }

       }

 

}

 






using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

//람다식 사용을 위해서 미리 만들어 놓은 델리게이트..

//  - Func 델리게이트(제네릭) 이용 하는법

namespace ConsoleEx

{

       class Ex08_Func

       {

             static void Main(string[] args)

             {

                    //요구사항] 정수값 입력 -> 제곱근 반환

 

                    //1. 람다식 -> 반드시 델리게이트 필요( 인자값 => 메서드본문)

                    //  : 람다식 -> 익명 메서드 -> 메서드 저장 -> 델리게이트 필요

 

                    Mydelegate md1 = e => e * e; //하단에 델리게이트 선언 되어 있다.

                    Console.WriteLine(md1(5));

 

                    //요구사항] 정수값 입력 -> 실수값 * 2.5 반환

                    //람다식 사용을 위해서 미리 만들어 놓은 델리게이트..

                    //  - Func 델리게이트(제네릭)

                    //<넘겨주는 자료형, 넘겨받는 자료형)

                    Func<double, double> md2 = e => e * 2.5;

                    Console.WriteLine(md2(2.1));

 

 

             }

       }

       //델리게이트 선언을 이렇게 밑에다가 작성해도 됨.

       public delegate int Mydelegate(int n);

 

}

 




using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace ConsoleEx

{

       //반환값이 없는 델리게이트

       public delegate void MyDelegate(string name);

       class Ex09_Action

       {

             static void Main(string[] args)

             {

                    //요구사항] 호출하면 인사하기!!

                    MyDelegate md1 = name => Console.WriteLine("안녕하세요 {0}", name);

                    md1("홍길동");

 

                    //Func : 매개변수O + 반환값O -> 대리호출 델리게이트

                    //Action : 매개변수O -반환값 X -델리게이트

                    //<넘겨주는자료형>

                    Action<int> md2 = n => Console.WriteLine(n * 2);

                    md2(10);

 

             }

       }

 

}

 



 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Ex01

{

       class Ex11_OrderBy

       {

             static void Main(string[] args)

             {

                    Student[] list2 = new Student[3];

                    list2[0] = new Student { Name = "홍길동", Age = 20, Kor = 100 };

                    list2[1] = new Student { Name = "이훈", Age = 25, Kor = 90 };

                    list2[2] = new Student { Name = "남궁옥분", Age = 30, Kor = 80 };

 

 

                    //다음의 item = Student의 인자

                    //order by Name

                    //var result = list2.OrderBy(item => item.Age);

                    //foreach (var item in result)

                    //{

                    //    Console.WriteLine(item.Name);

                    //}

 

                    //나이순으로 정렬한것을 이름으로 리턴 ******

                    //아래의 첫번째ㅑ orderby만 한 결과는 Student[]이 리턴되고 그 다음에 셀렉트에서 네임으로 필터링

                    var result = list2.OrderBy(item => item.Age).Select(item => item.Name);

                    foreach (var items in result)

                    {

                           Console.WriteLine(items);

                    }

                    Console.WriteLine();

 

                    //아래에서는 이미 앞부분에서 스트링(이름)만을 먼저 가져왔기때문에

                    //뒤의 Orderby에서 .Name가 없다.. 왜냐하면 item 자체가 Name이기 때문에 ***

                    //list2.Select(item => item.Name).OrderBy(item => item); ****

 

 

                    //order by len(name)

                    var result2 = list2.Select(item => item.Name).OrderBy(item => item.Length);

                    foreach (var item in result2)

                    {

                           Console.WriteLine(item);

                    }

 

 

              }

       }

 

       class Student

       {

             public string Name { get; set; }

             public int Age { get; set; }

             public int Kor { get; set; }

             public int Eng { get; set; }

             public int Math { get; set; }

       }

 

 

}

 

 

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Ex01

{

       class Ex12_Single

       {

             static void Main(string[] args)

             {

                    //Select() : 전체 항목 반환

                    //Single() : 단일 항목 반환

 

                    List<string> list1 = new List<string>();

                    list1.Add("가가가");

                    list1.Add("나나나");

                    list1.Add("다다다");

 

                    Student[] list2 = new Student[3];

                    list2[0] = new Student { Name = "홍길동", Age = 20, Kor = 100 };

                    list2[1] = new Student { Name = "이훈", Age = 25, Kor = 90 };

                    list2[2] = new Student { Name = "남궁옥분", Age = 30, Kor = 80 };

 

                    //string 컬렉션 (result1 = list1)

                    var result1 = list1.Select(item => item.Substring(0, 1));

                    foreach (var item in result1)

                    {

                           Console.WriteLine(result1);

 

                    }

 

                    //Single

                    var result2 = list1.Single(item => item == "나나나");

                    Console.WriteLine(result2);

 

                    //result3 Student를 리턴받음

                    var result3 = list2.Single(item => item.Name == "홍길동");

                    Console.WriteLine(result3.Name);

 

                    //.First() - 처음에 있는 한놈만 반환, 단 반환 형식은 Student

                    var result4 = list2.Select(item => item.Name == "홍길동").First();

 

             }

       }

 

       class Student

       {

             public string Name { get; set; }

             public int Age { get; set; }

             public int Kor { get; set; }

             public int Eng { get; set; }

             public int Math { get; set; }

       }

 

 

}

 



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Ex01

{

       class Ex13_Where

       {

             static void Main(string[] args)

             {

                    List<string> list1 = new List<string>();

                    list1.Add("이순신");

                    list1.Add("이문세");

                    list1.Add("홍길동");

 

                    var result1 = list1.Select(item => item.Substring(0, 1));//""의 집합

 

                    foreach (var item in result1)

                    {

                           Console.WriteLine("result1:{0}",item);

                    }

                    Console.WriteLine();

 

 

                    var result2 = list1.Where(item => item.Substring(0, 1) == "").Select(item => item.Substring(1, 2)).OrderByDescending(item => item);

 

                    foreach (var item in result2)

                    {

                           Console.WriteLine("result2:{0}", item);

                    }

             }

       }

}

 

 



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Ex01

{

       class Ex14_QueryExpression

       {

             static void Main(string[] args)

             {

                    //LINQ

                    // 1. 쿼리연산자(내부적으로 람다식)

                    // - Select(item = item.Name)

                    // 2. 쿼리 표현식

 

                    Student[] list2 = new Student[3];

                    list2[0] = new Student { Name = "홍길동", Age = 20, Kor = 100 };

                    list2[1] = new Student { Name = "이훈", Age = 25, Kor = 90 };

                    list2[2] = new Student { Name = "남궁옥분", Age = 30, Kor = 80 };

 

                    //var result1 = list2.Select(n => n).Where(n => n.Age > 10).OrderBy(n => n.Age);

 

                    //쿼리 연산자와 비슷하다.

                    var result1 = from item in list2

                                          where item.Age >= 25

                                          orderby item.Age ascending//or decending

                                          select item.Name;

 

                    //item.Name 컬렉션

                    foreach (var item in result1)

                    {

                           Console.WriteLine(item);

                    }

 

                    //1개이상 select 하고싶다면 익명 객체

                    var result2 = from item in list2

                                          where item.Age >= 25

                                          orderby item.Age ascending//or decending

                                          select new { Name = item.Name, Age = item.Age };

 

                    foreach (var item in result2)

                    {

                           Console.WriteLine(item.Name + " : " + item.Age);

                    }

                   

             }

       }

 

       class Student

       {

             public string Name { get; set; }

             public int Age { get; set; }

             public int Kor { get; set; }

             public int Eng { get; set; }

             public int Math { get; set; }

       }

}

 

 



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Ex01

{

       class Ex15_DB

       {

             static void Main(string[] args)

             {

                   

                    pubsDataContext pubs = new pubsDataContext();

 

                    //M1(pubs);

                    //M2(pubs);

                    M3(pubs);

             }

 


             private static void M3(pubsDataContext pubs)

             {

                    //Where, Order By

                    var list = pubs.titles.Where(item => item.price >= 15).OrderBy(item => item.title).Select(item => item.title);

 

                    foreach (var item in list)

                    {

                           Console.WriteLine(item);  

                    }

                   

             }

 


             private static void M2(pubsDataContext pubs)

             {

                    //책제목, 책가격, 출간일

                    var list = pubs.titles.Select(row => row);

                   

                    foreach (var item in list)

                    {

                           Console.WriteLine("{0} - {1} - {2}", item.title, item.price, item.pubdate);     

                    }

             }

 




             private static void M1(pubsDataContext pubs)

             {

                    //pubs.titles에서 도서제목을 출력

                   //테이블은 행의 집합 항목을 하나 갖고오는건 레코드를 하나 가져오겠 다는것.

                    //db에 있는 모든 것들이 프로퍼티로 제공 된다.

                    //생산성이 굉장히 높다.

                    var list = pubs.titles.Select(row => row.title);

 

                    foreach (var title in list)

                    {

                           Console.WriteLine(title);

                    }

             }

 

       }

}

 

 




using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Ex01

{

       class Ex16_DB

       {

             static void Main(string[] args)

             {

                    pubsMethodDataContext adonet = new pubsMethodDataContext();

 

                    //데이터 입력

                    //adonet.upMemoInsert("메모입니다.", "홍길동");

                    //adonet.upMemoInsert("메모입니다.2", "아무게");

                    //adonet.upMemoInsert("메모입니다.3", "테스트");

 

                    //수정

                    //adonet.upMemoUpdate("수정", "수정", 1);

 

                    //삭제

                    //adonet.upMemoDelete(1);

 

                    //전체보기

                    var result = adonet.upMemoSelect();

 

                    foreach (var item in result)

                    {

                           Console.WriteLine(item.memo);

                    }

 

                    //

                    var result2 = adonet.upMemoSearch("2");

 

                    foreach (var item in result2)

                    {

                           Console.WriteLine(item.memo);

                    }

             }

       }

}




TABLE

use ADONET;

 

--메모장

CREATE TABLE tblMemo

(

       seq int identity(1,1) not null primary key,

       memo varchar(1000) not null,

       name nvarchar(10) not null,

       regDate datetime default(getdate()) not null

)

 

--LINQ 제어-> 프로시저미리생성

 

--입력

CREATE proc upMemoInsert

       @memo varchar(1000),

       @name nvarchar(10)

AS

       INSERT INTO tblMemo (memo, name) VALUES(@memo, @name);

      

--수정

CREATE PROC upMemoUpdate

       @memo varchar(1000),

       @name nvarchar(10),

       @seq int

AS

       UPDATE tblMemo SET memo = @memo, name = @name WHERE seq = @seq;

      

--삭제

CREATE PROC upMemoDelete

       @memo varchar(1000),

       @name nvarchar(10),

       @seq int

AS

       DELETE FROM tblMemo WHERE seq = @seq;  

 

 

--출력

CREATE proc upMemoSelect

AS

       SELECT * FROM tblMemo;

      

-- 검색

CREATE proc upMemoSearch

       @search varchar(100)

AS

       SELECT * FROM tblMemo WHERE memo like '%' + @search + '%';

      

SELECT * FROM tblMemo

 





 

반응형