티스토리 뷰
[.NET/C# 3.0] - 람다식(Lambda Expressions) 을 이용한 확장 메서드(Extension Methods) 만들기 [1]
[.NET/C# 3.0] - 람다식(Lambda Expressions) 을 이용한 확장 메서드(Extension Methods) 만들기 [2]
[.NET/C# 3.0] - 람다식(Lambda Expressions) 을 이용한 확장 메서드(Extension Methods) 만들기 [2]
지난 아티클에서 우리는 List<> 컬렉션에 특정 요소를 탐색하기 위해 delegate 와, 익명 메서드, 람다식을 이용한 방법을 알아보았다.
List<> 컬렉션의 Find와 FindAll 메서드는 List<> 클래스가 제공하는 메서드지만, 이와 비슷한 확장 메서드를 손수 구현해 보도록 할 것이다.
이번에도 다음의 List<> 컬렉션의 데이터를 가지고 예제를 만들어 볼 것이다.
List<int> arr = new List<int>();
arr.Add(1);
arr.Add(2);
arr.Add(3);
arr.Add(4); |
지난 강좌에서 보듯 다음과 같이 List<> 클래스의 Find 메서드를 이용하여 특정 요소를 탐색한다.
int result = arr.Find(o => o == 2);
Console.WriteLine(result); |
List<Int>.Find 메서드를 확장 메서드로 구현
확장 메서드를 구현하기 위해 MyExtension 이라는 클래스를 만들고 UmcFind 라는 메서드를 만들자.
static class MyExtension
{
public static int UmcFind(this IEnumerable<int> arr, Predicate<int> p)
{
List<int> ret = new List<int>();
foreach (var v in arr)
{
if (p(v))
return v;
}
return 0;
}
} |
위 확장 메서드는 다음과 같이 호출이 가능하다.
int result = arr.UmcFind(o => o == 2);
Console.WriteLine(result); |
Public static int UmcFind(this IEnumerable<int> arr, Predicate<int> p)
의 선언을 보자.
인자값에 오는 this 는 확장메서드를 지원할 원본 객체의 타입이다. 즉, 우리는 List<int> 에 대한 객체에만 확장 메서드를 지원하게 된다.
Predicate<Int> p
는 .NET Framework 에서 선언된 bool 을 리턴하는 델리게이트이다.
즉, o => o == 2 람다식의 “ o == 2 “ 의 구현부는 Predicate 델리게이트에게 위임된 것이다.
때문에,
if( p( v ) )
와 같이 Predicate 의 리턴이 bool 이므로 람다식의 조건을 True/False 로 리턴 받을 수 있다.
List<Int>.FindAll 메서드를 확장 메서드로 구현
아래와 같이 사용되는 List<int>.FindAll 메서드를 확장 메서드로 구현해 보자.
List<int> result = arr.FindAll(o => o >= 2 && o <= 3);
result.ForEach(o => Console.WriteLine(o)); |
이번에는 .NET Framework 가 제공하는 델리게이트를 사용하지 않고, 직접 델리게이트를 선언해 볼 것이다.
delegate TResult FindAllHandler<T, TResult>(T t); |
FindAll 확장 메서드를 구현하기 위해 제네릭 델리게이트를 선언해 보았다.
첫번째 T 는 받을 인자 타입이고, 두번째 TResult 는 리턴 타입이 된다.
그럼 UmcFindAll 이라는 확장 메서드를 만들어 보자.
static class MyExtension
{
public static List<int> UmcFindAll(
this IEnumerable<int> arr, FindAllHandler<int,bool> p)
{
List<int> result = new List<int>();
foreach (var v in arr)
{
if( p(v) )
result.Add( v );
}
return result;
}
} |
위의 확장 메서드는 다음 처럼 사용이 가능하다.
List<int> list = arr.UmcFindAll(o => o >= 2 && o <= 3);
list.ForEach(o => Console.WriteLine(o)); |
보시는 바와 같이 List<> 클래스가 제공하는 FindAll 메서드와 동일한 기능을 하는 확장 메서드를 만들어보았다.
UmcFindAll 확장 메서드는 제네릭 델리게이트를 선언하여 예제를 만들어 보았지만, UmcFind 확장메서드를 유심히 본 독자라면 보는데 큰 어려움이 없을 것 같다.
이것으로. 람다식의 간략한 이용 방법과 람다식을 사용하는 확장 메서드에 대해서 알아 보았다.
'.NET > C#' 카테고리의 다른 글
LINQ To Sql 의 올바른 사용 (0) | 2007.09.17 |
---|---|
확장 메서드의 설계(Architect) (1) | 2007.09.12 |
람다식(Lambda Expressions) 을 이용한 확장 메서드(Extension Methods) 만들기 [1] (1) | 2007.09.08 |
LINQ 의 OUTER JOIN 작업 (0) | 2007.09.04 |
LINQ to SQL Classes 와 LINQ의 JOIN 작업 (2) | 2007.09.04 |
- TAG
- c#, C# 3.0, Lambda Expression, 람다표현식
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- 2,841,738
- Today
- 3
- Yesterday
- 47
링크
- ***** MY SOCIAL *****
- [SOCIAL] 페이스북
- [SOCIAL] 팀 블로그 트위터
- .
- ***** MY OPEN SOURCE *****
- [GITHUB] POWERUMC
- .
- ***** MY PUBLISH *****
- [MSDN] e-Book 백서
- .
- ***** MY TOOLS *****
- [VSX] VSGesture for VS2005,200…
- [VSX] VSGesture for VS2010,201…
- [VSX] Comment Helper for VS200…
- [VSX] VSExplorer for VS2005,20…
- [VSX] VSCmd for VS2005,2008
- .
- ***** MY FAVORITES *****
- MSDN 포럼
- MSDN 라이브러리
- Mono Project
- STEN
- 일본 ATMARKIT
- C++ 빌더 포럼
- .
TAG
- Visual Studio 2010
- 엄준일
- MEF
- Windows 8
- 비주얼 스튜디오
- 비주얼 스튜디오 2010
- Visual Studio 2008
- POWERUMC
- umc
- ALM
- Team Foundation Server
- LINQ
- TFS
- .NET
- Managed Extensibility Framework
- 팀 파운데이션 서버
- .NET Framework 4.0
- 땡초
- test
- Visual Studio
- c#
- ASP.NET
- github
- Visual Studio 11
- Team Foundation Server 2010
- TFS 2010
- mono
- monodevelop
- Silverlight
- testing
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
- 2020/05 (1)
- 2019/10 (3)
- 2018/11 (1)
- 2018/08 (2)
- 2017/04 (1)
- 2017/01 (2)
- 2016/11 (2)
- 2016/08 (1)
- 2016/05 (1)
- 2016/04 (2)
- 2016/02 (2)
- 2016/01 (1)
- 2015/05 (1)
- 2015/04 (2)
- 2015/03 (1)
- 2015/02 (1)
- 2015/01 (1)
- 2014/11 (1)
- 2014/09 (2)
- 2014/08 (2)
- 2014/05 (2)
- 2014/04 (3)
- 2014/03 (2)
- 2014/02 (2)
- 2014/01 (4)
- 2013/12 (2)
- 2013/11 (1)
- 2013/10 (2)
- 2013/09 (6)
- 2013/08 (3)