2008-08-16 6 views
6

J'adore les listes de compréhension en Python, car elles représentent de manière concise une transformation d'une liste.Remplacement pour ... si l'itération du tableau

Cependant, dans d'autres langues, je me retrouve souvent écrit quelque chose le long des lignes de:

foreach (int x in intArray) 
    if (x > 3) //generic condition on x 
    x++ 
    //do other processing 

Cet exemple est en C#, où je suis sous la LINQ impression peut aider, mais est-il une construction de programmation commune qui peut remplacer cette solution un peu moins qu'élégante? Peut-être une structure de données que je ne considère pas?

Répondre

5

l'incrément dans la boucle d'origine foreach n'affectera pas le contenu du tableau, la seule façon de le faire reste une boucle for:

for(int i = 0; i < intArray.Length; ++i) 
{ 
    if(intArray[i] > 3) ++intArray[i]; 
} 

Linq ne vise pas à modifier des collections ou des séquences existantes. Il crée de nouvelles séquences basées sur celles existantes. Il est possible d'obtenir le code ci-dessus en utilisant Linq, bien qu'il soit légèrement par rapport à ses fins:

var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i)); 
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i)); 

Utilisation where (ou équivalent), comme indiqué dans certaines des autres réponses, exclura toute valeur inférieure ou égale à 3 de la séquence résultante.

var intArray = new int[] { 10, 1, 20, 2 }; 
var newArray = from i in intArray where i > 3 select i + 1; 
// newArray == { 11, 21 } 

Il existe une méthode ForEach sur les tableaux qui vous permettront d'utiliser une fonction lambda au lieu d'un bloc foreach, mais pour quelque chose de plus qu'un appel de méthode que je tiendrais avec foreach.

intArray.ForEach(i => DoSomething(i)); 
-1

Selon la langue et ce que vous devez faire, une «carte» comme on l'appelle dans plusieurs langues pourrait être ce que vous cherchez. Je ne sais pas C#, mais selon la page this, .NET 2.0 appelle la carte "ConvertAll". La signification de "map" est assez simple - prenez une liste, et appliquez une fonction à chaque élément, en retournant une nouvelle liste. Vous pouvez également rechercher "filtre", ce qui vous donnerait une liste d'éléments qui satisfont un prédicat dans une autre liste.

0

en Ruby:

intArray.select { |x| x > 3 }.each do |x| 
    # do other processing 
end 

ou si « autre traitement » est une courte-liner:

intArray.select { |x| x > 3 }.each { |x| something_that_uses x } 

enfin, si vous voulez retourner un nouveau tableau contenant les résultats du traitement de ces éléments supérieurs à 3:

intArray.select { |x| x > 3 }.map { |x| do_something_to x } 
1

En Python, vous avez filter and map, w UEL pouvez donc ce que vous voulez:

map(lambda x: foo(x + 1) filter(lambda x: x > 3, intArray)) 

Il y a aussi list comprehensions qui peut faire les deux en une phrase simple:

[f(x + 1) for x in intArray if x > 3] 
2

En C#, vous pouvez appliquer un traitement sélectif sur tout ce qui vit dans un IEnumerable comme celui-ci:

intArray.Where(i => i > 3).ConvertAll(); 
DoStuff(intArray.Where(i => i 3)); 

Etc ..

0
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr)) 
Questions connexes