1. 확장 메서드란 무엇인가

확장 메서드는 C# 3.0 부터 추가된 기능으로 이미 정의된 형식에 사용자 정의 함수를 확장시키는 작업을 수행하는 메서드이다.

간단하게 클래스에 손을 대지 않고 메서드를 추가할 수 있는 방법이라 보면 된다.

2. 확장 메서드 선언하는 방법

(1) static 한정자로 메서드 선언

(2) 해당 메서드의 첫 번째 매개 변수는 반드시 this 키워드와 함께 확장하고자 하는 클래스(형식) 의 인스턴스여야 한다.

  • 확장 메서드 생성/호출 예제 #문자열 공백 카운트

    확장 메서드 생성

      public static class ExtenstionString
      {
          public static int GetSpaceCount(this String str)
          {
              if(!string.isNullOrEmpty(str))
              {
                  string[] spaceArray = str.Split(" ");
                  return spaceArray.Length - 1;
              } 
              else 
              {
                  return 0;
              }
          }
      }

    기본 클래스인 String 클래스를 활용하여 확장 메서드 호출

      class Program
      {
          static void Main(string[] args)
          {
              string str = "ABC DEL GHI JKL";
              Console.WriteLine(str.GetSpaceCount());
          }
      }
    
      [실행결과]
      3

정리하자면 확장 메서드란 기존 형식의 코드 변경 없이 사용자 임의로 만든 메서드를 대상 형식에 추가 할 수 있도록 도와주는 메서드이다.


1. LINQ란 무엇인가

LINQ란 Language Integrate Query의 약자로 통합 질의 언어이다,

기존의 Query는 Database의 데이터를 다루기 위해 사용된 언어이지만, LINQ는 컬렉션 형태로 되어있는 모든 데이터에 대해 질의를 할 수 있는 기술이다.

즉, MS-SQL 등 DB 데이터를 가져오는데 LINQ를 사용할 수 있는 것은 물론이고, 메모리상의 컬렉션 또는 XML에 대해서도 LINQ를 사용할 수 있다.

2. LINQ와 확장 메서드 관계

확장 메서드 LINQ에서 쿼리를 위한 메서드 Select, Where 등은 확장 메서드로 되어 있기 때문이다.

Aggregate, All, Any 등 파란색 화살표가 아래방향으로 향하는 것이 확장 메서드이다.

LINQ에서는 이처럼 많은 수의 확장 메서드를 사용한다.

3. Lambda Expression (람다 표현식)

익명 대리자, 무명 메서드를 좀 더 실용적으로 만든 것으로, 컴파일 과정에서 Delegate로 치환된다.

(매개변수들) => (표현식)
// **홀수** 출력 람다 표현식
// 컴파일 시 1,2번은 3번과 같이 Anonymous Delegate 형태
int[] numbers = {1,2,3,4,5,6,7,8,9}
1. IEnumerable<int> odds = numbers.Where(x=> x%2 == 1);
2. IEnumerable<int> odds = numbers.Where((int x) => x%2 == 1);
3. IEnumerable<int> odds = numbers.Where(delegate(int x) { return x%2 ==1; });

1. DataTable에서 확장 메서드 & LINQ & 람다를 활용

DataTable 에 LINQ 쿼리를 수행하려고 할 때, LINQ 쿼리는 DataTable, DataTable Row에 허용이 되지 않는다.

// #1) 회원 아이디가 "kmmun" 인 DataRow 조회

DataTable dt = biz.[SP명]
dt.Where(x => x["MemID"].ToString() == "kmmun"); // DataTable에 접근이 되지 않는다.
dt.Rows[0].Where(x => x["MemID"].ToString() == "kmmun"); // DataRow에 접근이 되지 않는다.

AsEnumerable() EnumerableRowCollection 을 활용하여 LINQ 쿼리 작성

public static EnumerableRowCollection<DataRow> AsEnumerable(this DataTable source);

DataTable dt = biz.[SP명]
dt.AsEnumerable().Where(x => x["MemID"].ToString() == "kmmun");

2. DataTable 형 변환, Null 체크

AsEnumerable() 행 컬렉션 LINQ 쿼리 후, CopyToDataTable()를 활용하여 DataTable로 형 변환 할 수 있다. 단, Where() 문 등 조건 이후 LINQ 쿼리 결과가 없을 수 있어 Row 개수를 체크 해준 후 CopyToDataTable() 해줘야한다.

DataTable dt = biz.[SP명]
int rowCnt = dt.AsEnumerable().Where(x => x["MemID"].ToString() == "kmmun").Count()

if(rowCnt > 0) 
{
    dt = dt.AsEnumerable().Where(x => x["MemID"].ToString() == "kmmun").CopyToDataTable();
}

참조

http://taeyo.net/Columns/View.aspx?SEQ=207&PSEQ=31&IDX=3

http://daplus.net/c-datatable에-대한-linq-쿼리/

반응형

'프로그래밍 > C#' 카테고리의 다른 글

DateTime 형식 ToString()으로 변환 시 문자열 처리  (0) 2020.12.18
Delegate  (0) 2020.03.22
DateTime 형식 ToString()으로 변환 시 문자열 처리

현재의 시간을 String형식으로 변환 시 사용 된다.

DateTime.Now.ToString("yyyy-MM-dd")	// "2020-12-18"

 

문자열 형식 설명
d  한 자리 또는 두 자리 날짜입니다. 
dd 두 자리 날짜입니다. 한 자리로 된 날짜 값 앞에는 0이 옵니다.
ddd 세 문자로 된 요일 약어입니다. 
dddd  요일의 전체 이름입니다. 
h  12시간 형식의 한 자리 또는 두 자리 시간입니다. 
hh  12시간 형식의 두 자리 시간입니다. 한 자리로 된 값 앞에는 0이 옵니다.
H 24시간 형식의 한 자리 또는 두 자리 시간입니다. 
HH 24시간 형식의 두 자리 시간입니다. 한 자리로 된 값 앞에는 0이 옵니다.
m 한 자리 또는 두 자리 분입니다. 
mm 두 자리 분입니다. 한 자리로 된 값 앞에는 0이 옵니다.
M 달을 나타내는 한 자리 또는 두 자리 숫자입니다. 
MM  달을 나타내는 두 자리 숫자입니다. 한 자리로 된 값 앞에는 0이 옵니다.
MMM  세 문자로 된 달의 약어입니다. 
MMMM  달의 전체 이름입니다. 
s  한 자리 또는 두 자리 초입니다. 
ss  두 자리 초입니다. 한 자리로 된 값 앞에는 0이 옵니다.
t 한 문자로 된 A.M./P.M. 약어이며, A.M.은 "A"로 표시됩니다.
tt  두 문자로 된 A.M./P.M. 약어이며, A.M.은 "AM"으로 표시됩니다.
y  한 자리 연도이며, 2001은 "1"로 표시됩니다. 
yy  연도의 마지막 두 자리이며, 2001은 "01"로 표시됩니다.
yyyy  완전한 형태의 연도이며, 2001은 "2001"로 표시됩니다.

 

출처 : redppiriri.tistory.com/2

 

반응형

'프로그래밍 > C#' 카테고리의 다른 글

DataTable에 대한 LINQ 쿼리  (0) 2022.08.23
Delegate  (0) 2020.03.22

Delegate : 델리게이트란 '대리인' 이란 뜻으로 누군가를 대신해서 일해주는 것을 전문으로 하는 것을 의미한다.

 

int num = 1;

String str = "test";

Int 형은 숫자, String은 문자열 타입을 담을 수 있듯이 메소드를 변수에 담고 사용한다고 생각하면 좀 더 쉽게 이해할 수 있을 것이다.

 

Delegate 선언 및 방식

-> delegate [ 참조할 함수의 반환 Type ] [ 델리게이트 명 ] (매개 변수 목록)

Ex) delegate int MyAddDelegate(int a, int b)

// 참조할 메소드

Public int AddDelegate(int a, int b)

{

      return a+b;

}

 

Delegate CallBack

- 여기서 Callback 이란 'A'라는 메소드를 호출했을 때 'A'에서 'B'메소드를 호출하는 것을 의미한다.

// 아래 그림 참조 > AddDelegate(), MinusDelegate(), MultiplyDelegate()를 대신 호출하는 것을 말한다.

namespace ConsoleApp2
{
    delegate int MyDelegate(int a, int b);

    class Program
    {
        static int num1 = 10;
        static int num2 = 5;

        static void Main(string[] args)
        {
            MyDelegate addDelegate = new MyDelegate(AddDelegate);
            MyDelegate minusDelegate = new MyDelegate(MinusDelegate);
            MyDelegate multiplyDelegate = new MyDelegate(MultiplyDelegate);

            Calcurator(num1, num2, addDelegate);
            Calcurator(num1, num2, minusDelegate);
            Calcurator(num1, num2, multiplyDelegate);
        }

        public static int AddDelegate(int a, int b)
        {
            return a + b;
        }

        public static int MinusDelegate(int a, int b)
        {
            return a - b;
        }

        public static int MultiplyDelegate(int a, int b)
        {
            return a * b;
        }

        public static void Calcurator(int a, int b, MyDelegate calcurate)
        {
            Console.WriteLine(calcurate(a, b));
        }
    }
}

<결과 출력>

 

반응형

'프로그래밍 > C#' 카테고리의 다른 글

DataTable에 대한 LINQ 쿼리  (0) 2022.08.23
DateTime 형식 ToString()으로 변환 시 문자열 처리  (0) 2020.12.18

+ Recent posts