.net - relacionadas - relaciones laravel
Reemplazo por... si la iteraciĆ³n del arreglo (6)
Me encantan las listas de comprensión en Python, porque representan de forma concisa una transformación de una lista.
Sin embargo, en otros idiomas, frecuentemente me encuentro escribiendo algo como:
foreach (int x in intArray)
if (x > 3) //generic condition on x
x++
//do other processing
Este ejemplo está en C #, donde tengo la impresión de que LINQ puede ayudarme con esto, pero ¿hay alguna construcción de programación común que pueda reemplazar esta solución ligeramente menos que elegante? Tal vez una estructura de datos que no estoy considerando?
Depende del idioma y de lo que necesite hacer, un "mapa" como se lo llama en muchos idiomas podría ser lo que está buscando. No sé C #, pero de acuerdo con esta página, .NET 2.0 llama al mapa "ConvertAll".
El significado de "mapa" es bastante simple: tomar una lista y aplicar una función a cada elemento de la misma, devolviendo una nueva lista. También puede estar buscando un "filtro", que le daría una lista de elementos que satisfacen un predicado en otra lista.
En C # puedes aplicar un procesamiento selectivo en cualquier cosa que viva dentro de un IEnumerable como este:
intArray.Where(i => i > 3).ConvertAll();
DoStuff(intArray.Where(i => i 3));
Etc ..
En Python, tienes filtro y mapa , que puede ser lo que quieras:
map(lambda x: foo(x + 1) filter(lambda x: x > 3, intArray))
También hay listas de comprensiones que pueden hacer ambas cosas en una sola declaración fácil:
[f(x + 1) for x in intArray if x > 3]
en Ruby:
intArray.select { |x| x > 3 }.each do |x|
# do other processing
end
o si "otro procesamiento" es un trazo corto:
intArray.select { |x| x > 3 }.each { |x| something_that_uses x }
por último, si desea devolver una nueva matriz que contenga los resultados del procesamiento de esos elementos mayores que 3:
intArray.select { |x| x > 3 }.map { |x| do_something_to x }
El incremento en el bucle foreach
original no afectará el contenido de la matriz, la única forma de hacer esto sigue siendo un bucle for
:
for(int i = 0; i < intArray.Length; ++i)
{
if(intArray[i] > 3) ++intArray[i];
}
Linq no tiene la intención de modificar colecciones o secuencias existentes. Crea nuevas secuencias basadas en las existentes. Es posible alcanzar el código anterior utilizando Linq, aunque está ligeramente en contra de sus propósitos:
var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));
El uso de where
(o equivalente), como se muestra en algunas de las otras respuestas, excluirá cualquier valor menor o igual a 3 de la secuencia resultante.
var intArray = new int[] { 10, 1, 20, 2 };
var newArray = from i in intArray where i > 3 select i + 1;
// newArray == { 11, 21 }
Hay un método ForEach
en las matrices que te permitirá usar una función lambda en lugar de un bloque foreach
, aunque para cualquier cosa que no sea una llamada a método me foreach
con foreach
.
intArray.ForEach(i => DoSomething(i));
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))