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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top