2009-04-24 8 views
6

Estoy luchando para entender LINQ y he llegado a la conclusión de que buscar entre docenas de ejemplos hasta que encuentre uno que esté cerca de mi propia aplicación en C# no me está enseñando a pescar.¿Cómo puedo descifrar los documentos del método Select en MSDN?

De vuelta a los documentos donde golpeé inmediatamente una pared de ladrillo.

¿Puede alguien ayudarme a descifrar el método Enumerable.Select como se presenta aquí en msdn http://msdn.microsoft.com/en-us/library/bb548891.aspx y dado como consejo por Intellisense?

Enumerable.Select (TSource, TResult) Método (IEnumerable (TSource>), Func (TSource, TResult))

Aquí está la misma línea desglosado con los números de línea si ayuda a referirse:

  1. Enumerable.Select
  2. (TSource, TResult)
  3. Método
  4. (IEnumerable (TSource>),
  5. Func
  6. (TSource, TResult))

Respuesta

7

Podría ayudar a mirar a la definición de este método en C#, del artículo de MSDN que se refieren a:

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source, 
    Func<TSource, TResult> selector 
) 

Los < paréntesis angulares > denotan los parámetros de tipo para este método genérico, y podemos comience a explorar el propósito del método simplemente mirando qué están haciendo los parámetros de tipo.

Comenzamos mirando el nombre del método genérico:

Select<TSource, TResult> 

Esto nos dice que el método llamado Select se ocupa de dos tipos diferentes:

  • El tipo TSource; y
  • El tipo TResult

Veamos los parámetros:

  1. El primer parámetro es IEnumerable<TSource> source - una fuente, proporcionando una enumeración TSource.
  2. El segundo parámetro es Func<TSource, TResult> selector - una función de selector que toma TSource y lo convierte en TResult. (Esto se puede comprobar mediante la exploración de la definición de Func)

luego nos fijamos en su valor de retorno:

IEnumerable<TResult> 

Ahora sabemos que este método devolverá una enumeración TResult.

Para resumir, tenemos una función que toma una enumeración de TSource, y una función de selección que se lleva individuales TSource elementos y devuelve TResult artículos, y luego toda la función de selección devuelve una enumeración de TResult.

Un ejemplo:

Para poner esto en términos concretos, supongamos que TSource es de tipo Person (una clase que representa a una persona, con un nombre, edad, sexo, etc), y TResult es de tipo String (que representa el nombre de la persona). Vamos a dar a la función Select una lista de Person s, y una función que, dado un Person seleccionará solo su nombre. Como resultado de llamar a esta función Select, obtendremos una lista de String que contiene solo los nombres de las personas.

Aparte:

La última pieza del rompecabezas de la firma del método original, en la parte superior, es el this palabra clave antes de que el primer parámetro. Esto es parte de la sintaxis para definir Extension Methods, y todo lo que esencialmente significa es que en lugar de llamar al método Select estático (pasando su enumeración de origen y función de selector) puede invocar directamente el método Select en su enumeración, como si tenía un método Select (y pasa solo un parámetro, la función de selector).

Espero que esto lo haga más claro para usted?

5

La manera de pensar en Select es como mapeo de cada elemento de una secuencia. Por lo tanto:

Enumerable.Select<TSource, TResult>: el método Select está parametrizado por sus tipos de fuentes y de resultado (el tipo de cosa que está correlacionando y el tipo está correlacionando a)

IEnumerable<TSource>: la secuencia de las cosas para mapear

Func<TSource, TResult>: la función de mapeo, que se aplicará a cada elemento de la secuencia de origen

el resultado ser un IEnumerable<TResult>, una secuencia de resultados de los mapas.

Por ejemplo, se podría imaginar (como un ejemplo trivial) mapear una secuencia de números enteros a las representaciones de cadena:

IEnumerable<string> strings = ints.Select(i => i.ToString()); 

Aquí intercepciones es el IEnumerable<TSource> (IEnumerable<int>) y i => i.ToString() es el Func<TSource, TResult> (Func<int, string>).

+0

Gracias por esta respuesta detallada. ¿La palabra clave "Método" solo dice Enumerable.Select es un método? Supongo que me pregunto ¿cómo puedo descifrar alguna línea de ayuda como esta? –

+0

Sí, eso es correcto. El título del tema de MSDN le indica el nombre del miembro, el tipo (método, propiedad, evento, campo) y, para los métodos sobrecargados, la firma de la sobrecarga que está mirando. (En el caso de Enumerable.Select, hay dos sobrecargas, que se distinguen por sus tipos de funciones de mapeo.) – itowlson

0

Soy de la opinión de que los últimos capítulos de C# in Depth hacen un buen trabajo al explicar LINQ, y lo que significa. Además, el resto del libro enseña una gran cantidad de otros conocimientos de C# muy útiles.

+0

Gracias Marc, tengo ese libro pero no lo encuentro útil. Estoy seguro de que tendrá perfecto sentido una vez que entiendo los temas. –

+0

@David: Si la respuesta de Daniel es más clara para usted que C# en profundidad, ¿podría sugerir qué áreas de C# en profundidad deberían modificarse para mejorarla? Estoy empezando a armar la segunda edición, ¡así que un comentario como ese sería muy útil! –

Cuestiones relacionadas