... | @@ -215,19 +215,21 @@ class Program |
... | @@ -215,19 +215,21 @@ class Program |
|
}
|
|
}
|
|
```
|
|
```
|
|
|
|
|
|
2. 데이터로서의 람다 식
|
|
2. 데이터로서의 람다 식
|
|
식을 표현한 데이터로 expression tree라고 한다.
|
|
식을 표현한 데이터로 expression tree라고 한다.
|
|
|
|
|
|
```cs
|
|
```cs
|
|
Expression<Func<int, bool>> exprTree = num => num < 5;
|
|
static void Main(string[] args)
|
|
|
|
{
|
|
|
|
Expression<Func<int, bool>> exprTree = num => num < 5;
|
|
|
|
|
|
// Decompose the expression tree.
|
|
// Decompose the expression tree.
|
|
ParameterExpression param = (ParameterExpression)exprTree.Parameters[0];
|
|
ParameterExpression param = (ParameterExpression)exprTree.Parameters[0];
|
|
BinaryExpression operation = (BinaryExpression)exprTree.Body;
|
|
BinaryExpression operation = (BinaryExpression)exprTree.Body;
|
|
ParameterExpression left = (ParameterExpression)operation.Left;
|
|
ParameterExpression left = (ParameterExpression)operation.Left;
|
|
ConstantExpression right = (ConstantExpression)operation.Right;
|
|
ConstantExpression right = (ConstantExpression)operation.Right;
|
|
|
|
|
|
Console.WriteLine("Decomposed expression: {0} => {1} {2} {3}", param.Name, left.Name, operation.NodeType, right.Value);
|
|
Console.WriteLine("Decomposed expression: {0} => {1} {2} {3}", param.Name, left.Name, operation.NodeType, right.Value);
|
|
|
|
}
|
|
```
|
|
```
|
|
|
|
|
|
* **람다 식을 위한 전용 delegate :**람다 식은 기존 method와 달리 일회성으로 사용되는 간단한 코드를 표현할 때 사용되는데, 정작 그러한 목적으로 delegate를 일일이 정의해야한다는 불편함이 발생한다. 마이크로소프트에서는 이러한 불편을 덜기 위해 자주 사용되는 delegate형식을 generic의 도움으로 일반화해서 BCL에 Action, Func로 포함시켰다.
|
|
* **람다 식을 위한 전용 delegate :**람다 식은 기존 method와 달리 일회성으로 사용되는 간단한 코드를 표현할 때 사용되는데, 정작 그러한 목적으로 delegate를 일일이 정의해야한다는 불편함이 발생한다. 마이크로소프트에서는 이러한 불편을 덜기 위해 자주 사용되는 delegate형식을 generic의 도움으로 일반화해서 BCL에 Action, Func로 포함시켰다.
|
... | @@ -243,7 +245,6 @@ Console.WriteLine("Decomposed expression: {0} => {1} {2} {3}", param.Name, left. |
... | @@ -243,7 +245,6 @@ Console.WriteLine("Decomposed expression: {0} => {1} {2} {3}", param.Name, left. |
|
|
|
|
|
`[생략 : T1 ~ T16까지 Action, Func delegate 정의]`
|
|
`[생략 : T1 ~ T16까지 Action, Func delegate 정의]`
|
|
|
|
|
|
* **collection과 람다 식**
|
|
|
|
* **람다식으로 Event를 구현하기**
|
|
* **람다식으로 Event를 구현하기**
|
|
Event의 [Event 사용법](#first)예제에서 callback method 부분을 아래와 같이 람다 식을 사용해서 구현할 수 있다.
|
|
Event의 [Event 사용법](#first)예제에서 callback method 부분을 아래와 같이 람다 식을 사용해서 구현할 수 있다.
|
|
```cs
|
|
```cs
|
... | @@ -344,7 +345,7 @@ public static IEnumerable<TSource> Where<TSource>( |
... | @@ -344,7 +345,7 @@ public static IEnumerable<TSource> Where<TSource>( |
|
Func<TSource, bool> predicate
|
|
Func<TSource, bool> predicate
|
|
)
|
|
)
|
|
```
|
|
```
|
|
predicate 값에 따라 value들의 sequence를 filtering한다.
|
|
predicate 값에 따라 value를 filtering한다.
|
|
|
|
|
|
```cs
|
|
```cs
|
|
List<string> fruits = new List<string> { "apple", "passionfruit", "banana", "mango", "orange", "blueberry", "grape", "strawberry" };
|
|
List<string> fruits = new List<string> { "apple", "passionfruit", "banana", "mango", "orange", "blueberry", "grape", "strawberry" };
|
... | @@ -374,18 +375,18 @@ foreach (int fruit in query) |
... | @@ -374,18 +375,18 @@ foreach (int fruit in query) |
|
Console.WriteLine(fruit);
|
|
Console.WriteLine(fruit);
|
|
}
|
|
}
|
|
```
|
|
```
|
|
## 5. **LINQ 기본 문법 정리**
|
|
## **5. LINQ 기본 문법 정리**
|
|
|
|
|
|
**1. where**
|
|
**1. where**
|
|
LINQ의 where를 통해 `IEnumerable<T>` type인 list collection에서 특정 조건을 만족하는 data를 filtering 할 수 있다. where의 조건절에는 return type으로 bool type을 만족하는 어떤 C#코드도 올 수 있다.
|
|
LINQ의 where를 통해 `IEnumerable<T>` type인 list collection에서 특정 조건을 만족하는 data를 filtering 할 수 있다. where의 조건절에는 return type으로 bool type을 만족하는 어떤 C#코드도 올 수 있다.
|
|
|
|
|
|
**2. orderby**
|
|
**2. orderby**
|
|
orderby를 이용해 정렬 작업을 수행할 수 있다. 기본적으로 `orderby person.Age ascending`(올림차순)으로 정렬하지만 `orderby person.Age descending`(내림차순)으로 정렬 할 수 있다.
|
|
orderby를 이용해 정렬 작업을 수행할 수 있다. 기본적으로 `orderby person.Age ascending`(올림차순)으로 정렬하지만 `orderby person.Age descending`(내림차순)으로 정렬 할 수 있다.
|
|
|
|
|
|
**3. group by**
|
|
**3. group by**
|
|
LINQ의 group by는 지정된 값을 기준으로 collection의 요소를 그룹으로 분류하고 최종적으로 모든 그룹의 collection을 반환한다. group by의 가능이 select를 담당하고 있기 때문에 select 구문이 올 수 없다.
|
|
LINQ의 group by는 지정된 값을 기준으로 collection의 요소를 그룹으로 분류하고 최종적으로 모든 그룹의 collection을 반환한다. group by의 가능이 select를 담당하고 있기 때문에 select 구문이 올 수 없다.
|
|
|
|
|
|
**4. join**
|
|
**4. join**
|
|
LINQ의 join은 data collection 중에서 on equal 조건을 만족하는 요소끼리 묶어 반환하는 기능을 제공한다. on equal은 조건을 만족하는 record가 없다면 제외시킨다. 이러한 join 유형을 Inner join이라고 한다. LINQ에는 Outer join에 대한 keyword는 별도로 없고 아래 그림과 같이 collection을 후처리하는 방법을 사용한다.
|
|
LINQ의 join은 data collection 중에서 on equal 조건을 만족하는 요소끼리 묶어 반환하는 기능을 제공한다. on equal은 조건을 만족하는 record가 없다면 제외시킨다. 이러한 join 유형을 Inner join이라고 한다. LINQ에는 Outer join에 대한 keyword는 별도로 없고 아래 그림과 같이 collection을 후처리하는 방법을 사용한다.
|
|
|
|
|
|
``` cs
|
|
``` cs
|
... | | ... | |