Linq : Select와 Where의 차이점은 무엇입니까?


122

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


7
나는이 질문이 CW로 표시되어야한다고 생각하지 않는다. 그것은 아마도 확실한 대답을 가질 수있을 것이다.
Brandon

1
@Brandon이 객관적이라면 CW를 표시하는 데 아무런 문제가 없습니다.
Rex M

@Rex, 동의합니다. Select와 Where의 차이에 확실한 답이 있으며 질문의 두 번째 부분은 일반적으로 받아 들여지는 관행을 기반으로 할 가능성이 큽니다. OP가 물건을 CW로 표시하는 것에 대해 확신하지 못하는 경우를 대비하여 지적했습니다. 그가 CW가 되려고했다면 괜찮습니다.
Brandon

6
그것에는 많은 문제가 있습니다. CW는 쓸모가없고, 사람들이 질문을 완전히 무작위로 CW로 표시하면 점점 더 많아집니다
jalf

답변:


126

어디

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

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

고르다

소스의 모든 항목에 대해 무언가를 반환합니다 ( 투영 / 변환 ). 그 무언가는 항목 자체 일 수 있지만 일반적으로 일종의 투영입니다.

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


15
Select필터 조건에 관계없이 목록에서 항상 동일한 수의 요소를 반환합니다. Where필터 조건에 따라 더 적은 요소를 반환 할 수 있습니다.
goku_da_master 2014

그리고 여기 의 MSDN의 예입니다 select여기에 하나입니다where
yazanpro

다른 언어와 몇 가지 배경을 가지고, 나를 위해 적어도, 그것은 생각하는 데 도움이 Where == filterSelect == map
bgusach

52

SelectWhereIEnumerable에서 작동하는 완전히 다른 두 개의 연산자 입니다.

첫 번째는 우리가 프로젝션 연산자 라고 부르는 것이고, 마지막 것은 제한 연산자 입니다.

이러한 연산자의 동작에 대한 통찰력을 얻는 한 가지 흥미로운 방법은 "기능적 유형"을 살펴 보는 것입니다.

  • 선택 : (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가 도입 한 다른 연산자를 살펴보고 그 동작을 추론 한 후 설명서를 살펴보세요!


47

그들은 구별됩니다.

Select변화 에 관한 모든 것 입니다.

Where필터링 에 관한 것 입니다.


18

Select는 열거 형을 새 구조에 매핑합니다. IEnumerable에서 선택을 수행하면 요소 수가 같지만 지정한 매핑에 따라 유형이 다른 배열이 생성됩니다. IEnumerable을 필터링하여 원래 IEnumerable의 하위 집합을 제공합니다.



7

그들이 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 메서드와는 다릅니다. 식 트리를 사용하여 동일하게 구현하기 때문입니다.


1

선택의 경우 새 구조의 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> ]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.