문제

그만큼 Select 그리고 Where 방법은 LINQ에서 사용할 수 있습니다. 모든 개발자는이 두 가지 방법에 대해 무엇을 알아야합니까? 예를 들어 : 하나 이상을 사용하는 경우, 다른 하나 이상을 사용하는 장점 등.

도움이 되었습니까?

해결책

어디에

일치하는 항목을 찾아서 한 항목 만 반환합니다 (필터링).

-> IEnumerable<A> 안에, IEnumerable<A> 밖으로

고르다

무언가를 반환합니다 모두 소스의 항목 (투영 / 변환). 그것은 무언가가 항목 자체 일지 모르지만 더 일반적으로 어떤 종류의 투영입니다.

-> IEnumerable<A> 안에, IEnumerable<B> 밖으로

다른 팁

고르다 그리고 어디에 완전히 다른 운영자가 작용합니다 ienumerable에스.

첫 번째는 우리가 a라고 부르는 것입니다 투영 연산자, 마지막 것은 a입니다 제한 연산자.

그러한 연산자의 행동에 대한 통찰력을 갖는 흥미로운 방법 중 하나는 "기능적 유형"을 살펴 보는 것입니다.

  • 선택 : (ienumerableu003CT1> , funcu003CT1,T2> ) → ienumerableu003CT2>; 유형 T1의 요소를 포함하는 Ienumerable을 모두 입력하여 타입 T1의 함수 변환 요소를 T2 유형 요소로 변환합니다. 출력은 유형 T2의 요소를 포함하는 ienumerable입니다.

    이것으로부터,이 연산자는 입력의 각 요소에 입력 함수를 적용하여 결과를 새로운 ienumerable 안에 래핑함으로써 출력을 생성 할 수 있다고 쉽게 추측 할 수 있습니다.

    수학과 같은 표기법을 사용하면 입력이 필요합니다 (a, b, c, ...) : ienumerableu003CT1> 그리고 F : T1 → T2 그리고 생산합니다 (F (a), F (b), f (c), ...) : ienumerableu003CT2>

  • 어디에 : (ienumerableu003CT1> , funcu003CT1, bool> ) → ienumerableu003CT1> ; 이것은 유형 T1의 요소와 T1의 술어 (즉, 유형 T1의 입력에 대한 부울 결과를 생성하는 함수)를 포함하는 Ienumerable을 포함합니다. 출력은 또한 유형 T1의 요소를 포함하는 ienumerable이라는 것을 알 수 있습니다.

    이번에는 입력이 요소에 적용 된 결과에 따라 입력 ienumerable의 요소가 ienumerable에 존재할 것이라고 추측 할 것입니다. 이것에 연산자 이름의 의미론을 추가하면 입력을 통해 입력 한 출력을 생성 할 수 있습니다.

사람들과 기능적 프로그래밍 배경은 보통 이렇게 생각합니다. 그것은 당신이 당신이 유형을 보면 오퍼레이터가하는 일을 추론 할 수 있습니다!

연습으로 LINQ가 Ienumerables에서 소개 한 다른 연산자를보고 문서를 살펴보기 전에 그들의 행동을 추론하십시오!

그것들은 뚜렷합니다 :

Select 모든 것입니다 변환.

Where 모든 것입니다 필터링.

새 구조에 열거 가능한 맵을 선택하십시오. ienumerable에서 Select를 수행하는 경우 지정된 매핑에 따라 동일한 수의 요소가 있지만 다른 유형의 배열을 얻게됩니다. Ienumerable을 필터링하여 원래 ienumerable의 서브 세트를 제공합니다.

그들이 어디에서 구현했는지 알고 있다면 확장 방법을 선택할 수있는 방법을 예측할 수 있다면 ... 나는 위치를 구현하려고 노력했고 확장 방법을 선택했습니다 ... 당신은 그것을 볼 수 있습니다 ...

구현 위치 ::

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 구현 확장 방법과는 다릅니다. 표현 트리를 사용하여 동일한 구현을 구현하기 때문입니다.

Where ~ = 필터

Select ~ =지도

둘 다 반환합니다 IEnumerable<T>

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top