C # / Linq: Aplicar uma função de mapeamento a cada elemento em um IEnumerable?

107

Tenho procurado uma maneira de transformar cada elemento de um IEnumerable em outra coisa usando uma função de mapeamento (de uma forma compatível com o Linq), mas não encontrei nada.

Para um exemplo (muito simples), ele deve ser capaz de fazer algo como

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

Mas não encontrei nada. Quero dizer, é muito simples escrever um método de extensão que faça isso (basicamente, tudo o que requer é agrupar o enumerador de origem em uma nova classe e, em seguida, escrever um pouco de código clichê para delegar as chamadas a ele), mas eu esperava esta é uma operação bastante elementar, e escrevê-la por mim mesmo parece reinventar a roda - não consigo evitar a sensação de que pode haver uma maneira embutida que eu deveria estar usando, e estou cego demais para ver isto.

Então ... há algo no Linq que me permite fazer o que descrevi acima?

Andreas Baus
fonte

Respostas:

172

Você pode apenas usar o Select()método de extensão:

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

Ou na sintaxe do LINQ:

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

var strings = from i in integers
              select i.ToString();
George Duckett
fonte
4
Ah! Eu sabia que tinha que haver uma maneira. Um pouco do velho "Problema de Oclusão Visual de Floresta / Árvores", eu acho :)
Andreas Baus
2
Esteja ciente de que se o seu mapa tiver efeitos colaterais, você poderá ter problemas, pois o corpo do Select()não será necessariamente executado até que seja enumerado. Não que seja uma ótima ideia fazer isso, mas pode haver algumas situações em que você pode precisar adicionar ToList()para forçá-lo a avaliar a lista inteira.
Dave Nichol
6
Não é mais correto chamar uma forma de 'sintaxe de consulta linq' e a outra forma de 'sintaxe de método linq'?
Ryan Harmuth de
2
Na verdade, ambos são tipos de sintaxe Linq, o primeiro é chamado de sintaxe de método e o segundo é chamado de sintaxe de consulta. Leia mais: docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
Machado
27

Você está procurando Selectqual pode ser usado para transformar \ projetar a sequência de entrada:

IEnumerable<string> strings = integers.Select(i => i.ToString());
Tim Lloyd
fonte
9
Para ser justo, ele deve corresponder ao SQL (onde o último conjunto de termos é uma terminologia comum)
éclairevoyant
5
É muito chato. Estou tentando aprender programação funcional ... mas preciso desaprender 10 anos de termos do LINQ. Preciso de um guia de tradução. Gostaria de saber se o Google Translate poderia ajudar ...
Damien Sawyer