그만큼 Select
및 Where
방법은 Linq에에서 사용할 수 있습니다. 모든 개발자는이 두 가지 방법에 대해 무엇을 알아야합니까? 예를 들어, 다른 하나를 사용하는 경우, 다른 하나를 사용하는 경우의 이점 등
그만큼 Select
및 Where
방법은 Linq에에서 사용할 수 있습니다. 모든 개발자는이 두 가지 방법에 대해 무엇을 알아야합니까? 예를 들어, 다른 하나를 사용하는 경우, 다른 하나를 사용하는 경우의 이점 등
답변:
어디
일치하는 항목을 찾고 일치하는 항목 만 반환합니다 ( 필터링 ).
-> IEnumerable<A>
안으로, IEnumerable<A>
밖으로
고르다
소스의 모든 항목에 대해 무언가를 반환합니다 ( 투영 / 변환 ). 그 무언가는 항목 자체 일 수 있지만 일반적으로 일종의 투영입니다.
-> IEnumerable<A>
안으로, IEnumerable<B>
밖으로
Select
필터 조건에 관계없이 목록에서 항상 동일한 수의 요소를 반환합니다. Where
필터 조건에 따라 더 적은 요소를 반환 할 수 있습니다.
Where == filter
와Select == map
Select 및 Where 는 IEnumerable에서 작동하는 완전히 다른 두 개의 연산자 입니다.
첫 번째는 우리가 프로젝션 연산자 라고 부르는 것이고, 마지막 것은 제한 연산자 입니다.
이러한 연산자의 동작에 대한 통찰력을 얻는 한 가지 흥미로운 방법은 "기능적 유형"을 살펴 보는 것입니다.
선택 : (IEnumerable <T1>, Func <T1, T2>) → IEnumerable <T2> ; T1 유형의 요소를 포함하는 IEnumerable과 T1 유형의 요소를 T2 유형의 요소로 변환하는 함수를 모두 입력으로받습니다. 출력은 T2 유형의 요소를 포함하는 IEnumerable입니다.
이로부터 입력 IEnumerable의 각 요소에 입력 함수를 적용하고 결과를 새로운 IEnumerable 안에 래핑하여이 연산자가 출력을 생성 할 것이라고 쉽게 추측 할 수 있습니다.
수학적 표기법을 사용하여 입력 (a, b, c, ...) : IEnumerable <T1> 및 f : T1 → T2 를 사용하여 (f (a), f (b), f (c)를 생성합니다. , ...) : IEnumerable <T2>
여기서 : (IEnumerable <T1>, Func <T1, bool>) → IEnumerable <T1> ; 이것은 T1 유형의 요소와 T1에 대한 술어를 포함하는 IEnumerable을 취합니다 (즉, T1 유형의 입력에 대한 부울 결과를 생성하는 함수). 출력은 T1 유형의 요소를 포함하는 IEnumerable이기도합니다.
이번에는 요소에 조건자를 적용한 결과에 따라 입력 IEnumerable의 요소가 출력 IEnumerable에 존재한다고 추측합니다. 여기에 연산자 이름의 의미를 추가하면 조건 자의 응용 프로그램에서 true로 평가되는 요소 만 입력에서 가져옴으로써 출력 IEnumerable을 생성 할 수 있습니다.
함수형 프로그래밍 배경을 가진 사람들은 보통 이렇게 생각합니다. 연산자의 유형 만보고 무엇을하는지 추론 (또는 적어도 추측 ...) 할 수 있습니다!
실습으로 IEnumerables에서 LINQ가 도입 한 다른 연산자를 살펴보고 그 동작을 추론 한 후 설명서를 살펴보세요!
그들이 Where를 구현 한 방법을 알고 확장 메서드를 선택하면 그것이 무엇을하는지 예측할 수 있습니다 ... 나는 어디에서 구현하고 확장 메서드를 선택하려고했습니다 ... 당신은 그것을 볼 수 있습니다 ...
구현 위치 ::
public static IEnumerable<Tsource> Where<Tsource> ( this IEnumerable<Tsource> a , Func<Tsource , bool> Method )
{
foreach ( var data in a )
{
//If the lambda Expression(delegate) returns "true" Then return the Data. (use 'yield' for deferred return)
if ( Method.Invoke ( data ) )
{
yield return data;
}
}
}
구현 선택 ::
public static IEnumerable<TResult> Select<TSource , TResult> ( this IEnumerable<TSource> a , Func<TSource , TResult> Method )
{
foreach ( var item in a )
{
//Each iteration call the delegate and return the Data back.(use 'yield' for deferred return)
yield return Method.Invoke ( item );
}
}
내 구현은 모든 컬렉션에 대해 잘 작동하지만 Microsoft에서 구현 한 Extension 메서드와는 다릅니다. 식 트리를 사용하여 동일하게 구현하기 때문입니다.
선택의 경우 새 구조의 IEnumerable에 매핑 할 수 있습니다.
A.Select(x=>new X{UID=x.uid, UNAME=x.uname})
//input as [IEnumerable<A>] --------> return output as [IEnumerable<X> ]
Where ()는 IEnumerable에 대한 필터로 작동하며 where 절을 기반으로 결과를 반환합니다.
A.Where(x=>x.uid!=0) //input as [IEnumerable<A>] --------> return output as [IEnumerable<A> ]