C # / Linq: appliquer une fonction de mappage à chaque élément dans un IEnumerable?

107

J'ai cherché un moyen de transformer chaque élément d'un IEnumerable en quelque chose d'autre en utilisant une fonction de mappage (d'une manière compatible Linq) mais je n'ai rien trouvé.

Pour un exemple (très simple), il devrait être capable de faire quelque chose comme

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<string> strings = integers.Transform(i => i.ToString());

Mais je n'ai rien trouvé. Je veux dire, il est assez simple d'écrire une méthode d'extension qui accomplit cela (en gros, tout ce qu'il faut, c'est envelopper l'énumérateur source dans une nouvelle classe, puis écrire un peu de code standard pour lui déléguer les appels), mais je me serais attendu c'est une opération assez élémentaire, et l'écrire moi-même, c'est comme réinventer la roue - je ne peux pas me débarrasser du sentiment qu'il peut y avoir un moyen intégré que je devrais utiliser, et j'ai juste été trop aveugle pour voir il.

Alors ... y a-t-il quelque chose dans Linq qui me permet de faire ce que j'ai décrit ci-dessus?

Andreas Baus
la source

Réponses:

172

Vous pouvez simplement utiliser la Select()méthode d'extension:

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<string> strings = integers.Select(i => i.ToString());

Ou dans la syntaxe LINQ:

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };

var strings = from i in integers
              select i.ToString();
George Duckett
la source
4
Ah! Je savais qu'il devait y avoir un moyen. Un peu du vieux "problème d'occlusion visuelle forêt / arbres", je suppose :)
Andreas Baus
2
Sachez que si votre carte a des effets secondaires, vous risquez de rencontrer des problèmes car le corps du Select()ne sera pas nécessairement exécuté tant qu'il ne sera pas énuméré. Ce n'est pas une bonne idée de faire cela, mais il peut y avoir des situations où vous devrez peut-être ajouter ToList()pour le forcer à évaluer la liste entière.
Dave Nichol
6
N'est-il pas plus correct d'appeler la première forme «syntaxe de requête linq» et l'autre forme «syntaxe de méthode linq»?
Ryan Harmuth
2
En fait, les deux sont des types de syntaxe Linq, le premier est appelé syntaxe de méthode et le second est appelé syntaxe de requête. En savoir plus: docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
Machado
27

Vous recherchez Selectce qui peut être utilisé pour transformer \ projeter la séquence d'entrée:

IEnumerable<string> strings = integers.Select(i => i.ToString());
Tim Lloyd
la source
9
Pour être juste, il est censé correspondre à SQL (où le dernier ensemble de termes est une terminologie courante)
éclairevoyant
5
C'est assez ennuyeux. J'essaie d'apprendre la programmation fonctionnelle ... mais je dois désapprendre 10 ans de termes LINQ. J'ai besoin d'un guide de traduction. Je me demande que Google translate pourrait aider ...
Damien Sawyer