Tengo una clase ( Biome ) que contiene una matriz 2D de objetos personalizados ( Level ). Con frecuencia quiero recorrer todos (o algunos) de los niveles y realizar algunas acciones, por ejemplo, establecer su propiedad de color.
En lugar de escribir el mismo bucle for anidado una y otra vez, ¿puedo crear mi propio método que me permita hacer algo como: ForEachLevel(SetColour()) ?. ¿Dónde SetColour() sería un método en mi clase de Biome que simplemente establece la propiedad de color del nivel en algún valor aleatorio o usa alguna otra lógica basada en factores dentro del Biome ?
Así que en lugar de:
for (int r = 0; d < Rows; r++) { for (int c = 0; l < Cols; c++) { if (some logic here) Levels[r, c].Colour = Color.Red; else Levels[r, c].Colour = Color.Green; } }Podría hacer algo como:
ForEachLevel(SetColour(--what goes here?--)); void SetColour(Level level){ if (some logic here) level.Colour = Color.Red; else level.Colour = Color.Green; }O incluso mejor, me gustaría hacer algo similar que solo ejecute una función en, por ejemplo, las filas X a Y.
Como puede ver en mi ejemplo, ni siquiera sé cómo obtendría el contexto de cada instancia de Level en la función SetColour.
Puedo seguir copiando/pegando mis bucles anidados personalizados para lograr lo que quiero, pero esperaba que alguien con más experiencia pudiera entender lo que estoy tratando de hacer y señalarme la dirección correcta sobre cómo puedo usar mejores técnicas de C#.
Debido a que he sido vago, entiendo si no se puede dar una respuesta específica , ¡pero se agradecerían algunos conceptos clave para futuras investigaciones! Gracias
EDIT2 en realidad ese intento anterior no funciona en absoluto. Olvidé que necesito llamar a ForEachLevel en otro lugar. Sigo trabajando en eso.
private void SomeOtherMethod() { // where I want to actually use the ForEachLevel() ForEachLevel(SetLevelColor(--Level??--, Color.red)); } private void ForEachLevel(Action DoAThing) { for (int d = 0; d < Depths; d++) { for (int l = 0; l < Lanes; l++) { DoAThing(); } } } private void SetLevelColor(Level level, Color color) { // trivial example level.Color = color; }