Di ricambio per... se la matrice di iterazione
Domanda
Mi piace list comprehensions in Python, perché sinteticamente rappresentare una trasformazione di un elenco.
Tuttavia, anche in altre lingue, spesso lo trovo a scrivere qualcosa sulla falsariga di:
foreach (int x in intArray)
if (x > 3) //generic condition on x
x++
//do other processing
Questo esempio è in C#, in cui ho l'impressione di LINQ può aiutare con questo, ma c'è qualche comune costrutto di programmazione che può sostituire questo un po ' meno-che-elegante soluzione?Forse una struttura di dati che non sto considerando?
Soluzione
L'incremento in originale foreach
loop, non influenzano il contenuto dell'array, l'unico modo per fare questo rimane un for
loop:
for(int i = 0; i < intArray.Length; ++i)
{
if(intArray[i] > 3) ++intArray[i];
}
Linq non è destinato a modificare le collezioni esistenti o sequenze.Crea nuove sequenze sulla base di quelli esistenti.È possibile ottenere il codice di cui sopra, utilizzando Linq, anche se è leggermente contro i suoi scopi:
var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));
Utilizzando where
(o equivalente), come mostrato in alcune delle altre risposte, per escludere qualsiasi valore inferiore o uguale a 3 dalla sequenza risultante.
var intArray = new int[] { 10, 1, 20, 2 };
var newArray = from i in intArray where i > 3 select i + 1;
// newArray == { 11, 21 }
C'è un ForEach
metodo di matrici che vi permetterà di utilizzare una funzione lambda invece di un foreach
blocco, anche se per qualcosa di più di una chiamata al metodo vorrei bastone con foreach
.
intArray.ForEach(i => DoSomething(i));
Altri suggerimenti
In C# è possibile applicare elaborazione selettiva su tutto ciò che vive all'interno di un oggetto IEnumerable come questo:
intArray.Where(i => i > 3).ConvertAll();
DoStuff(intArray.Where(i => i 3));
Ecc..
In Python, si sono filtro e mappa, che può ciò che si vuole:
map(lambda x: foo(x + 1) filter(lambda x: x > 3, intArray))
C'è anche list comprehensions che può, con una semplice istruzione:
[f(x + 1) for x in intArray if x > 3]
Ruby:
intArray.select { |x| x > 3 }.each do |x|
# do other processing
end
o se "altre lavorazioni" è una breve one-liner:
intArray.select { |x| x > 3 }.each { |x| something_that_uses x }
infine, se si desidera restituire un nuovo array contenente i risultati del trattamento di tali elementi sia superiore a 3:
intArray.select { |x| x > 3 }.map { |x| do_something_to x }
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))
Dipende dalla lingua e che cosa dovete fare, una "mappa", come viene chiamato in molte lingue potrebbe essere quello che stai cercando.Non conosco C#, ma secondo questo pagina .NET 2.0 chiamate mappa "ConvertAll".
Il significato di "mappa" è piuttosto semplice, fare un elenco, e applicare una funzione a ogni elemento di esso, restituendo una nuova lista.Si può anche essere alla ricerca di "filtro", che fornisce un elenco di elementi che soddisfano il predicato di un altro elenco.