Considérez la construction JavaScript commune suivante
var ages = people.map(person => person.age);
Donner le résultat souhaité, qui est un tableau d'âges.
Quel est l'équivalent de ceci dans C # ? S'il vous plaît inclure un exemple simple. La documentation indique select
ou possible selectAll
, mais je ne trouve pas d’exemple en ligne ni aucune autre question SO pouvant être collée et qui fonctionne.
Si possible, donnez un exemple qui transforme le tableau {1,2,3,4}
suivant en {'1a','2a','3a','4a'}
suivant. Pour chaque élément, ajoutez "a" à la fin, en le faisant passer d'un entier à une chaîne.
Ceci s'appelle la projection qui s'appelle Select
dans LINQ. Cela ne renvoie pas un nouveau tableau (comme le fait le .map
de JavaScript), mais un IEnumerable<T>
. Vous pouvez le convertir en tableau avec .ToArray
.
var ages = people.Select(person => person.Age).ToArray();
Select
fonctionne avec tous les IEnumerable<T>
implémentés par les tableaux. Vous avez juste besoin de .NET 3.5 et d'une instruction using System.Linq;
.
Pour votre deuxième exemple, utilisez quelque chose comme ceci. Notez qu'il n'y a pas de tableaux en cours d'utilisation - seulement des séquences.
var items = Enumerable.Range(1, 4).Select(num => string.Format("{0}a", num));
Seulement pour info, si people
est un List<Person>
, la méthode ConvertAll
est assez similaire à map
de JS, par exemple:
var ages = people.ConvertAll<int>(person => person.age);
Mais si vous avez un tableau et que vous voulez utiliser n’importe quelle méthode List<T>
, vous pouvez facilement y parvenir en convertissant votre variable en une liste à partir d’un tableau, par exemple:
var ages = people.ToList().ConvertAll<int>(person => person.age);
Et enfin, si vous avez vraiment besoin d’un retour Array, vous pouvez le reconvertir, par exemple:
var ages = people.ToList().ConvertAll<int>(person => person.age).ToArray();
Mais ce dernier exemple n’est pas aussi bon que les autres réponses et vous devriez utiliser Select
si vous travaillez uniquement avec des tableaux. Mais si vous le pouvez, je vous suggère de passer à List<T>
, c'est beaucoup mieux!
Le .Select
de Linq est l'équivalent map
et .Aggregate
est l'équivalent fold
.
var nums = new[] {1,2,3,4};
string[] r = nums.Select(x => x + "a").ToArray();
Les méthodes d'extension LINQ sur les collections vous offrent une foule d'utilitaires vraiment pratiques. Select
est l'un d'entre eux:
int[] arr = { 1, 2, 3 };
IEnumerable<string> list = arr.Select(el => el + "a");
string[] arr2 = list.ToArray();
foreach (var str in arr2)
Console.Write(str + " ");
Cela devrait produire:
1a 2a 3a
Ceci peut être condensé en toute sécurité sur une doublure:
string[] arr2 = arr.Select(el => el + "a").ToArray();
Un exemple de travail:
Documents liés:
Vous pouvez utiliser les mots clés from
, select
, in
et while
;
Ou pour votre exemple:
var ages = (from person in people select person.age).ToArray();
Donc, la syntaxe serait essentiellement la suivante:
<<list-output>> = (from <<var-name>> in <<list-input>> select <<operation>>);