728x90
반응형
Lambda Expression
1. Expression Lambda
(parameter) => expression
class Program
{
delegate int Calc(int a, int b); // 익명 메소드를 만들기 위한 델리게이트
public static void Main(string[] args)
{
Calc c = (a, b) => a + b; // 익명 메소드를 람다식으로 구현
Console.WriteLine("{0} + {1} = {2}", 1, 2, c(1, 2));
}
}
2. Statement Lambda
(parameter) => {code, code, code};
class Program
{
delegate void DoSomething();
public static void Main(string[] args)
{
/* 문 형식의 람다식에서
* 전달할 매개변수가 없으면 비워두면 됨 */
DoSomething DoIt = () =>
{
Console.WriteLine("C#");
Console.WriteLine("짱 재밌자너~");
};
DoIt();
}
}
Func, Action, Predicate Delegate
Lambda Expression을 사용해서 익명 메소드를 사용하기 위해서 매번 별개의 대리자를 선언해야 한다.
이 문제를 해결하기 위해서 MS는 .NET Framework에 Func와 Action 대리자를 미리 선언해 두었다.
1) Func delegate
결과를 반환하는 메서드를 참조하기 위해 만들어졌다.
class Program
{
public static void Main(string[] args)
{
Func<int, int, int> c = (a, b) => a + b; // 익명 메소드를 람다식으로 구현
Console.WriteLine("{0} + {1} = {2}", 1, 2, c(1, 2));
}
}
2) Action delegate
void 메서드를 참조하기 위해 만들어졌다.
class Program
{
public static void Main(string[] args)
{
/* 문 형식의 람다식에서
* 전달할 매개변수가 없으면 비워두면 됨 */
Action DoIt = () =>
{
Console.WriteLine("C#");
Console.WriteLine("짱 재밌자너~");
};
DoIt();
}
}
3) Predicate delegate
Predicate<T>는 Func<T, bool>과 같다.
List<T>.ForEach(Action<T>) Method
List<int> list = new List<int> {1, 2, 3, 4, 5};
foreach(var item in list)
{
Console.WriteLine(item + " * 2 = " + (item * 2));
}
//List<T>에 정의된 Foreach Action delegate 를 사용해서 아래와 같이 처리 가능하다.
list.ForEach((item) => {Console.WriteLine(item + " * 2 = " + (item * 2));});
List<T>.FindAll(Predicate<T>) Method
List<int> list = new List<int> {1, 2, 3, 4, 5};
List<int> evenList = new List<int>();
foreach (var item in list)
{
if(item % 2 ==0)
{
evenList.Add(item);
}
}
//FindAll 메서드를 이용하면
List<int> evenList = list.FindAll((elem) => elem % 2 == 0);
Count<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)
Enumerable 타입의 확장메서드 Count를 사용하여 Func delegate를 넘겨줄 수 있다.
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
var totalCount = list.Count;
var evenCount = list.Count((item) => item > 2);
var evenCount2 = (from a in list
where a > 2
select a).Count();
Where<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)
List<string> fruits =
new List<string> { "apple", "passionfruit", "banana", "mango",
"orange", "blueberry", "grape", "strawberry" };
IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6);
foreach (string fruit in query)
{
Console.WriteLine(fruit);
}
Func<string, bool> isShorterSixLength = s => s.Length < 6;
//Func Delegate in LINQ Method Syntax
IEnumerable<string> query2 = fruits.Where(isShorterSixLength);
foreach (string fruit in query2)
{
Console.WriteLine(fruit);
}
//Func Delegate in LINQ Query Syntax
IEnumerable<string> query3 = from s in fruits where isShorterSixLength(s) select s;
foreach (string fruit in query3)
{
Console.WriteLine(fruit);
}
728x90
반응형
'C#' 카테고리의 다른 글
IEnumerable vs ICollection vs IList 차이점 (0) | 2021.12.02 |
---|---|
C#] LINQ 쿼리 키워드 let (0) | 2021.11.05 |
C#] Tuple types (0) | 2021.10.13 |
C#] EmailTemplate 활용하여 메일 발송하기 (0) | 2021.09.28 |
C#] 메일발송 클래스 (0) | 2021.09.09 |
댓글