Pregunta

El Select y Where Los métodos están disponibles en Linq.¿Qué debería saber todo desarrollador sobre estos dos métodos?Por ejemplo:cuándo usar uno sobre el otro, las ventajas de usar uno sobre el otro, etc.

¿Fue útil?

Solución

Where

encuentra elementos que coinciden y solo devuelve los que sí lo hacen ( filtrado ).

- > IEnumerable<A> dentro, IEnumerable<B> fuera

Seleccione

devuelve algo para todos elementos en la fuente ( proyección / transformación ). Ese algo podría ser los elementos en sí, pero generalmente es una proyección de algún tipo.

- > <=> dentro, <=> fuera

Otros consejos

Seleccionar y Donde son dos operadores completamente diferentes que actúan sobre IEnumerable s.

El primero es lo que llamamos un Operador de proyección , mientras que el último es un Operador de restricción .

Una forma interesante de tener una idea del comportamiento de dichos operadores es echar un vistazo a su " tipo funcional " ;.

  • Seleccione: (IEnumerable < T1 > ;, Func < T1, T2 >) & # 8594; IEnumerable & Lt; T2 & Gt; ; toma como entrada un elemento IEnumerable que contiene elementos de tipo T1 y una función que transforma elementos de tipo T1 en elementos de tipo T2. La salida es un IEnumerable que contiene elementos de tipo T2.

    A partir de esto, uno puede adivinar fácilmente que este operador producirá su salida aplicando la función de entrada en cada elemento de la entrada IEnumerable y ajustando los resultados dentro de un nuevo IEnumerable.

    Usando alguna notación matemática, toma como entrada (a, b, c, ...): IEnumerable < T1 > y f : T1 & # 8594; T2 y produce (f (a), f (b), f (c), ...): IEnumerable & Lt; T2 & Gt;

  • Donde: (IEnumerable < T1 > ;, Func < T1, bool >) & # 8594; IEnumerable & Lt; T1 & Gt; ; este toma un IEnumerable que contiene elementos de tipo T1 y un predicado en T1 (es decir, una función que produce un resultado booleano para una entrada de tipo T1). Verá que la salida también es un IEnumerable que contiene elementos de tipo T1.

    Esta vez, uno adivinaría que un elemento de la entrada IEnumerable estará presente en la salida IEnumerable dependiendo del resultado de la aplicación del predicado al elemento. Agregando a esto la semántica del nombre del operador, puede estar seguro de que producirá la salida IEnumerable tomando de la entrada uno solo aquellos elementos que se evalúan como verdaderos en la aplicación del predicado.

Las personas con experiencia en programación funcional generalmente piensan así. ¡Le permite deducir (o al menos adivinar ...) lo que hace un operador solo mirando su tipo!

¡Como ejercicio, intente mirar a otros operadores introducidos por LINQ en IEnumerables y deduzca su comportamiento, antes de mirar la documentación!

Son distintos:

Select tiene que ver con la transformación .

Where se trata de filtrado .

Seleccionar asigna un enumerable a una nueva estructura. Si realiza una selección en un IEnumerable, obtendrá una matriz con el mismo número de elementos, pero un tipo diferente dependiendo de la asignación que especificó. Donde filtra el IEnumerable para que le proporcione un subconjunto del IEnumerable original.

Si sabe cómo han implementado Where y selecciona métodos de extensión, puede predecir lo que está haciendo ... Traté de implementar dónde y seleccionar métodos de extensión ... Puedes echarle un vistazo ...

Donde Implementación ::

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;
        }
    }
}

Seleccionar implementación ::

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 );
    }
}

Mi implementación funciona bien para cualquier colección ... Pero difiere de los métodos de extensión implementados por Microsoft, porque usan árboles de expresión para implementar lo mismo.

Where ~ = Filtro

Select ~ = Mapa

Ambas devoluciones IEnumerable<T>

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top