2009-04-24 5 views
6

J'ai du mal à comprendre LINQ et je suis arrivé à la conclusion que chercher dans des douzaines d'exemples jusqu'à ce que j'en trouve un qui est proche de ma propre application en C# ne m'apprend pas à pêcher.Comment déchiffrer les documents de la méthode Select sur MSDN?

Alors revenons aux documents où je frappe immédiatement un mur de briques.

Quelqu'un peut-il m'aider s'il vous plaît à déchiffrer la méthode Enumerable.Select comme présenté ici sur msdn http://msdn.microsoft.com/en-us/library/bb548891.aspx et donné comme un conseil par Intellisense?

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

Voici la même ligne brisée vers le bas avec les numéros de ligne si elle aide à se référer:

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

Répondre

7

Il pourrait aider à examiner la définition de cette méthode en C#, de l'article MSDN vous vous référez:

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

Les équerres <> désignent les paramètres de type pour cette méthode générique, et nous pouvons Commencer à explorer le but de la méthode simplement en regardant ce que les paramètres de type font.

Nous commençons par regarder le nom de la méthode générique:

Select<TSource, TResult> 

Cela nous dit que la méthode appelée Select traite de deux types différents:

  • Le Type TSource; et
  • Le type TResult

Examinons les paramètres:

  1. Le premier paramètre est IEnumerable<TSource> source - une source, fournissant une énumération TSource.
  2. Le deuxième paramètre est Func<TSource, TResult> selector - une fonction de sélection qui prend un TSource et le transforme en TResult. (Cela peut être vérifié en examinant la définition de Func)

Ensuite, nous regardons sa valeur de retour:

IEnumerable<TResult> 

Nous savons maintenant cette méthode renvoie une énumération TResult.

Pour résumer, nous avons une fonction qui prend une énumération de TSource, et une fonction de sélection qui prend TSource particu liers et retourne TResult articles, puis l'ensemble retourne la fonction de sélection d'une énumération des TResult.

Un exemple:

Pour mettre cela en termes concrets, permet de dire que TSource est de type Person (une classe représentant une personne, avec un nom, l'âge, le sexe, etc.), et TResult est de tapez String (représentant le nom de la personne). Nous allons donner à la fonction Select une liste de Person s, et une fonction qui, étant donné un Person sélectionnera simplement leur nom. Comme la sortie de l'appel de cette fonction Select, nous obtiendrons une liste de String s contenant uniquement les noms des personnes.

dehors:

La dernière pièce du puzzle à partir de la signature de la méthode originale, en haut, est le mot-clé this avant le premier paramètre. Cela fait partie de la syntaxe pour définir Extension Methods, et tout ce que cela signifie essentiellement est qu'au lieu d'appeler la méthode statique Select (passant dans votre énumération source, et la fonction de sélection) vous pouvez simplement appeler la méthode Select directement sur votre énumération, comme si il avait une méthode Select (et passe en un seul paramètre - la fonction de sélection).

J'espère que cela le rend plus clair pour vous?

5

La façon de penser Select est que la cartographie de chaque élément d'une séquence. Par conséquent:

Enumerable.Select<TSource, TResult>: la méthode Select est paramétrée par sa source et les types de résultats (le type de chose que vous mappez et le type que vous mappez à)

IEnumerable<TSource>: la séquence de choses à la carte

Func<TSource, TResult>: la fonction de mappage, qui sera appliquée à chaque élément de la séquence source

le résultat étant un IEnumerable<TResult>, une séquence de résultats de la cartographie.

Par exemple, vous pouvez imaginer (comme un exemple trivial) cartographier une séquence d'entiers aux représentations de chaîne:

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

ints Voici le IEnumerable<TSource> (IEnumerable<int>) et i => i.ToString() est le Func<TSource, TResult> (Func<int, string>).

+0

Merci pour cette réponse détaillée. Est-ce que le mot-clé "Méthode" indique simplement Enumerable.Select est une méthode? Je suppose que je me demande comment déchiffrer une ligne d'aide comme celle-ci? –

+0

Oui, c'est vrai. Le titre de la rubrique MSDN vous indique le nom du membre, le type (méthode, propriété, événement, champ) et, pour les méthodes surchargées, la signature de la surcharge que vous examinez. (Dans le cas de Enumerable.Select, il y a deux surcharges, qui se distinguent par leurs types de fonctions de mapping.) – itowlson

0

Je suis d'avis que les chapitres suivants de C# in Depth expliquent correctement LINQ et ce que tout cela signifie. De plus, le reste du livre enseigne un peu d'autres connaissances C# très utiles.

+0

Merci Marc, j'ai ce livre mais je ne le trouve pas utile. Je suis sûr que cela sera parfaitement logique une fois que je comprendrai les sujets. –

+0

@David: Si la réponse de Daniel est plus claire pour vous que C# en profondeur, pourriez-vous suggérer quelles zones de C# en profondeur devraient être modifiées pour l'améliorer? Je commence à mettre en place la deuxième édition, donc un tel retour serait très utile! –

Questions connexes