2013-05-13 2 views
3

Je suis un débutant complet Linq ici, alors pardonnez-moi pour une question probablement assez simple.Exécution de la fonction sur chaque élément du tableau, renvoi des résultats au nouveau tableau

Je souhaite effectuer une opération sur chaque élément d'un tableau et renvoyer le résultat de chacune de ces opérations à un nouveau tableau. Par exemple, disons que j'ai un tableau ou des nombres et une fonction ToWords() qui convertit les nombres en leurs équivalents de mots, je veux pouvoir passer dans le tableau de nombres, effectuer l'opération ToWords() sur chaque élément et je passe une corde []

Je sais que c'est tout à fait possible d'une manière un peu plus verbeuse, mais dans mes aventures Linq, je me demande si c'est faisable dans un joli doublage.

+3

Y at-il quelque chose que vous avez essayé? Des morceaux de code que vous avez écrits mais qui n'ont pas réussi à faire ce dont vous aviez besoin? – Pako

+0

La sortie est-elle une chaîne par nombre ("cent un") ou plusieurs chaînes par nombre ("un", "cent", "et", "un")? –

Répondre

6

Vous pouvez utiliser Select() pour transformer une séquence dans un autre, et ToArray() pour créer un tableau à partir du résultat:

int[] numbers = { 1, 2, 3 }; 
string[] strings = numbers.Select(x => ToWords(x)).ToArray(); 
+0

Ah, comment diable ai-je manqué ça? Merci! :) – Dan

+0

Ne connaissait pas 'Select', toujours utilisé' ToList(). ConvertAll() '. Merci! – Teejay

6

C'est assez simple. Il suffit d'utiliser la méthode Select:

var results = array.Select(ToWords).ToArray(); 

Notez que si vous avez besoin d'un tableau, vous ne devez pas appeler ToArray. La plupart du temps, vous pouvez utiliser l'évaluation paresseuse sur un IEnumerable<string> tout aussi facilement.

+0

Merveilleusement concis, merci! – Dan

0

Il y a deux approches différentes - vous pouvez utiliser Select méthode d'extension ou vous pouvez utiliser select clause :

var numbers = new List<int>(); 
var strings1 = from num in numbers select ToWords(num); 
var strings2 = numbers.Select(ToWords); 

deux d'entre eux reviendront IEnumerable<>, que vous pouvez jeter que vous avez besoin (par exemple, avec .ToArray() ou .ToList()).

0

Vous pourriez faire quelque chose comme ceci:

public static string[] ProcessStrings(int[] intList) 
    { 
     return Array.ConvertAll<int, string>(intList, new Converter<int, string>(
     delegate(int number) 
     { 
      return ToWords(); 
     })); 
    } 

Si elle est une liste alors:

public static List<string> ProcessStrings(List<int> intList) 
    { 
     return intList.ConvertAll<string>(new Converter<int, string>(
     delegate(int number) 
     { 
       return ToWords(); 
     })); 
    } 
0

simple, droite:

string[] wordsArray = array.ToList().ConvertAll(n => ToWords(n)).ToArray(); 

Si vous êtes OK avec les listes, plutôt que les tableaux, vous pouvez ignorer ToList() et ToArray(). Les listes sont beaucoup plus flexibles que les tableaux, je ne vois aucune raison sur terre de ne pas les utiliser, sauf pour des cas spécifiques.

Questions connexes