블로그 이미지
Magic_kit
study 관련자료를 한곳으로 자기 개발 목적으로 재태크 재무 관리 목적으로 일상생활의 팁을 공유 하기 위하여 블로그를 개설 하였습니다.

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Category

Recent Post

Recent Comment

Archive

2009. 8. 19. 13:53 .Net Project/.Net C#
반응형

 LINK(Language INtegrated Query)
닷넷 프로엠워크 3.5에서 새로 도입된 방식으로서, 데이터를 다루는 획기적인 방법입니다.

게임이나 시스템 소프트웨어 같은 일부 특수한 경우를 제외하고 대부분 응용 프로그램들은 데이터가 있어만 동작이 가능하며, 데이터를 읽고 검색하는 일은 반드시 아주 높으며 중요한 작업 입니다.

쿼리란.. 데이터 소스에서 특정 조건에 맞는 데이터를 검색하는 지시사항입니다.
명령을 내리면 서버나 DB 모듈이 쿼리의 지시대로 데이터를 구해 리턴을 하며, 데터를 있는 
그대로 일기만 하는 것이 아니라, 보기 좋게 정렬하거나 그룹핑을 할 수도 있어 출력방식에 대한 
지시까지도 포함 하고 있습니다. 

 IEnumerable Interface.cs

using System;
using System.Collections.Generic;
using System.Linq;

public class IEnumerable인터페이스
{
    public static void Main()
    {
        //link
        int[] data = { 3, 5, 4, 2, 1 };

        //IEnumerable 인터페이스 변수 선언/초기화
        //System.Collections.Generic.IEnumerable<int> query = from d in data
        //                                                    where d % 2 == 0
        //                                                    select d;

        //일종의 공식이라고 생각하며 쿼리문 잘 활용 DB연결시 장점을 가지고 있음

       

IEnumerable<int> query = from d in data where d % 2 == 0 select d; 

        foreach (var item in query)
        {
            //data라는 배열에서 짝수인것만 뽑아내고 있다.
            Console.WriteLine("{0}",item);
        }

    }
}

 쿼리연산자.cs
쿼리연산자란 ?
가장 직접적인 확장이 가능한것을 의미하며, 쿼리 표현식은 구하고자 하는 데이터와 출력방식을 함축적으로 설명하는 일종의 스크립트 언어로써, 사용되고 있습니다.

form으로 시작해서 select나 group라고 할 수 있으며, 조건없이 모든 데이터를 읽어 
출력하고 있으며, 배열을 정의하고 이 배열을 데이터 소스로 사용 가능 합니다.

using System;
using System.Linq;
using System.Collections.Generic;

 public class Product //속성을 지정하기 위해 생성
{
    public string Name { get; set; } //상품명
    public int UnitPrice { get; set; } //단가
}

public class 쿼리식
{
    public static void Main()
    {
        //1.원본 데이터 : Product형 배열
        Product[] pros = { new Product { Name = "닷넷", UnitPrice = 1000 },
                                new Product { Name = "자바", UnitPrice = 1000 } };

        //object타입으로 배열선언 
       

 object[] arr = { 10, 20, 30 };

        //2.쿼리식 Link으로 뽑아내기 
        

 IEnumerable<Product> q = from p in pros where p.Name[0] =='닷'
                                            select p;

        //IEnumerable<Product> q = from p in pros select p; //모두 출력

  IEnumerable<int> query = from int a in arr where a % 4 == 0
                                             select a; //4의 배수 추출 

        //IEnumerable<int> query = from int s in arr select s;  //모두출력
       
       
//3.출력
    foreach (var item in q)
        {
            Console.WriteLine("{0}, {1}", item.Name, item.UnitPrice);
           
        }

        //object타입선언후 출력하기위해 사용
   foreach (var item in query)
        {
            Console.WriteLine("{0}",item);
        }
      
}
}

 표준쿼리연산자.cs
 VB9.0dms LINQ 지원을 위해 언어 자체에 쿼리 표현식이라는 기능을 추가

쿼리 구현을 위한 메서드를 메서드 쿼리 처리자(Standard Query Operators)라고
부르고 있으며, 직역하여 말하자면 표준 쿼리 연산자라고 불러야 겠습니다 (+,-) 같은 연산자처럼 셈을 하는 것이 아니라 좀 더 복잡한 처리를 수행할 수 있는 메서드 이므로,
처리자로 변역을 하고 있습니다.

또한 쿼리 표현식은 사용중인 메서드는 대신하여 바로 호출할 수도 있으며,
메서드보다는 쿼리 표현식이 더 간결하고 가독성도 높으므로 가급적이면 쿼리 표현식을
쓰기를 권하고 있습니다.

단점으로는 모든 쿼리를 다 표현하지 못하고 있는다는것에 한계가 존재하고 있으며,
지원하지 못하는 동작들은 직접호출해야 한다는 단점을 가지고 있습니다.

using System;
using System.Collections.Generic;
using System.Linq;

public class 표준쿼리연산자
{
    public static bool EvenNum(int x) { return (x % 2 == 0); }
    public static void Main()
    {

        //input
        int[] data = { 3, 5, 4, 2, 1 };
        //process
      
   
     //IEnumerable<int> q = from d in data select d; //전체출력
        //IEnumerable<int> q = from d in data where d % 2 == 0 select d;
        //짝수/ 1.쿼리식
        //IEnumerable<int> q = from d in data where d % 2 == 0 orderby d
  
                                     
select d; //정렬
       
        //var q = data.Where(EvenNum);
//2.메서드를 통해서 짝수일때만 반환
       

  var q = data.Where(delegate(int x) { return(x%2 ==0);}); //익명메서드       



        //output

        foreach (var item in q)
        {
            Console.WriteLine("{0}",item);
        }
}
}

 쿼리식 반환값 처리.Cs
 쿼리식 반환값 처리
아래와 같은 내용으로 반환값을 처리 (form d ~ select d).ToList()
List<int> lst = (from d in data orderby d descending select d).ToList(); 

using System;
using System.Collections.Generic;
using System.Linq;

public class 쿼리식반환값처리
{
    public static void Main()
    {
        int[] data = { 3, 5, 4, 2, 1 };

        //Process
    

     IEnumerable<int> q = from d in data select d; //기본
        var query = from d in data select d; //var   
  
 int[] sorted = (from d in data orderby d select d).ToArray(); //배열
        
        for (int i = 0; i < sorted.Length; i++)
        {
            Console.WriteLine("{0}", sorted[i]);
        }
    
     //컬렉션
List<int> lst = (from d in data orderby d descending select d).ToList(); 

        for (int i = 0; i < lst.Count; i++)
        {
            Console.WriteLine("{0}", lst[i]);
           
        }
    }
}

 지연된 실행.Cs
 지연된실행이란?
쿼리는 단일값을 구하는 간단한 질문일 수도 있지만, 때로는 거대한 데이터 집합을
요구하는 것일 수도 있으며, 내용에 따라 오랜시간이 걸릴 수 도 있기 때문에 LINQ는
쿼리를 즉시 실행하지 않고 아래의 내용과 같이 3단계를 거쳐 구성하고 있습니다.
 1. 원하는 데이터가 저장된 데이터 소스 준비
    배열이나 컬렉션 정도는 소스에서 간단히 정의 할 수 있지만, DB나 XML문서는
    다소 복잡한 과정을 통하여 연결 또는 파싱해 두어야  합니다.
 2. 질문 내용에 따라 쿼리가 생성되며,  어떤 조건에 맞는 데이터를 가져 오라거나
    가져온 데이터를 어떤식으로 출력하라는 명령문 작성
 3. 생성된 쿼리 실행 foreach문 또는 for 통하여 실행


using System;
using System.Linq;
using System.Collections.Generic;

public class 지연된실행
{
    public static void Main()
    {
        int[] data = { 3, 5, 4, 2, 1 };
        

 var q = from d in data orderby d select d;

        //for (int i = 0; i < data.Length; i++)
        //{
        //    Console.WriteLine("{0}",data[i]);
           
        //}
        foreach (var item in q)
        {
            Console.WriteLine("{0}",item);
           
        }

        //중간에 데이터 변경 

   data[0] = 1000;
        foreach (var item in q)
        {
            Console.WriteLine("{0}",item);
        }

      
}
}

 쿼리 표현 (알고리즘) 활용.Cs

using System;
using System.Collections.Generic;
using System.Linq;

public class 합계카운트평균
{
    public static void Main()
    {
        //input
        int[] data = { 3, 5, 4, 2, 1 };
        //process
        //var q = from d in data where d % 2 == 0 select d;

        var q = from d in data select d; //모두출력

        int sum = q.Sum(); //합계
        int cnt = q.Count(); //카운터
        int avg = sum / cnt;//평균
        //평균 Convert이용하여 표현 가능
        int avgg = Convert.ToInt32(q.Average()); //평균

        //다른방식 최소값 구하기(방식무수히~)
        //최대값

        int min = (from d in data select d).OrderByDescending(p => p).First();
        //최소값
        int listmin = (from d in data select d).OrderByDescending(p => 
                                                          p).Last();
        //최소값
        int minn = (from d in data select d).OrderBy(p => p).First();

        //output
        Console.WriteLine("합계 : {0} \n카운트 : {1} \n평균 : {2}", sum,
                                         cnt, avg);
        Console.WriteLine("평균 : {0}",avgg);
   
        //최대값(코드간결장점)
        Console.WriteLine("최대값 :{0}",(from d in data select d).Max());
       
        //최소값
        Console.WriteLine("최소값 :{0}", min);
        Console.WriteLine("최소값:{0}",listmin);
        Console.WriteLine("최소값 :{0}", minn);
    }
}


 쿼리 표현 (알고리즘) 병합 활용.Cs

 using System;
using System.Collections.Generic;
using System.Linq;

public class 병합
{
    public static void Main()
    {
        int[] data1 = { 3, 5, 4 };
        int[] data2 = { 2, 1 };

        //Union사용 결합후 orderBy정렬

 int[] result = (from o in data1 select o).Union(from t in data2
                           select t).OrderBy(x => x).ToArray();
        
        for (int i = 0; i < result.Length; i++)
        {
            Console.WriteLine("{0}", result[i]);
           
        }

    }
}


 쿼리 표현 (알고리즘) 그룹 알고리즘.Cs

using System;
using System.Collections.Generic;
using System.Collections;
using System.LINQ //완전조아~ 넌 이제 내꼬얌 !!
namespace LINQ
{
    using System.Linq;

    public class ProductInfo
    {
        public string Name { get; set; }
        public int Quantity { get; set; }
    }

    public class 그룹알고리즘
    {
        public static void Main()
         {
            //input

  List<ProductInfo> lst = new List<ProductInfo>()
             {
                 new ProductInfo{Name="Radio", Quantity=3},
                 new ProductInfo{Name="TV", Quantity=1},
                 new ProductInfo{Name="Radio", Quantity=2},
                 new ProductInfo{Name="DVD", Quantity=5},
             };
            
            //process
 IEnumerable<IGrouping<string, ProductInfo>>
                               q = from p in lst group p by p.Name;
             
            //Output
             foreach (var item in q)
             {
                 //그룹화된 것이 순서대로 출력
                 Console.WriteLine("{0}",item.Key);

                 foreach (var pi in item)
                 {
                     Console.WriteLine("상품 :{0} 판매량:{1}",
                                            pi.Name, pi.Quantity);                    
                 }
             }
         }
    }


쿼리표현식 (참고사항)

 http://msdn.microsoft.com/ko-kr/library/bb397676.aspx


반응형

'.Net Project > .Net C#' 카테고리의 다른 글

102장 윈폼(Windows Form)  (0) 2009.08.20
101장 프로젝션  (0) 2009.08.20
99장 람다식  (0) 2009.08.19
97장 초기화자(Initilizer)  (0) 2009.08.18
96장 그룹(Group) 알고리즘  (0) 2009.08.18
posted by Magic_kit