2012-07-02 8 views
7
private void makeMoleVisable(int mole, PictureBox MoleHill) 
    { 
     switch (mole) 
     { 
      case 1: 
       if (p01.Image == pmiss.Image && MoleHill.Image == pHill.Image) 
       { 
        molesmissed ++; 
       } 
       p01.Image = MoleHill.Image; 
       break; 
      case 2: 
       if (p02.Image == pmiss.Image && MoleHill.Image == pHill.Image) 
       { 
        molesmissed++; 
       } 
       p02.Image = MoleHill.Image; 
       break; 

** Tengo 36 de estas declaraciones de casos cada una para otra para un cuadro de imagen diferente; cómo agrupo a todos en una declaración de caso para que mi código sea más eficiente **¿Cómo fusiono todas las cajas en una sola?

+0

personas He expresado esto a continuación, pero ¿qué tal pasar el objeto de la imagen (es decir, p01, p02) como un argumento para la función, y la imagen topo "foreach" que llama a la función? – contactmatt

Respuesta

0

Prueba esto:

 string ControlIdSuffix = mole < 10 ? "0" : "" + mole.ToString(); 
     Control[] picBoxes = this.Controls.Find("p" + ControlIdSuffix, true); 
     if (picBoxes.Length > 0) 
     { 
      PictureBox p = picBoxes[0] as PictureBox; 
      if (p != null) { 
       if (p.Image == pmiss.Image && MoleHill.Image == pHill.Image) 
        molesMissed++; 
       p.Image = MoleHill.Image; 
      } 
     } 
+0

Considere esto acerca de su primera línea: (ex) '1.ToString (" 00 ") ->" 01 "' –

+0

Gracias, este funcionó mejor. –

9

Parece que su caso se usa para seleccionar una imagen, luego siempre aplica el mismo procesamiento a la imagen.

¿Qué tal si almacena la imagen en una lista o diccionario, use el valor mole para recuperar la imagen correcta, luego procese esa imagen?

Algo así como

Dictionary<int, PictureBox> images; 
var image = images[mole]; 
// do stuff to image 

Si las imágenes están numeradas secuencialmente todo, una lista es ligeramente más eficiente. Recuerde que los índices de lista están basados ​​en 0. Si numera sus imágenes de 1 como parece ser el caso de su declaración switch (asumida en el siguiente ejemplo), recuerde ajustar en consecuencia.

List<PictureBox> images; 
int index = mole - 1; // Assumes mole starts with 1, so adjust to 0-based index 
var image = images[index]; 
+0

Y ruede a través de los topos en un bucle 'for'. – bluevector

+2

Parecen ser todas las claves enteras secuenciales, por lo que una 'Lista' tendría más sentido que un' Diccionario'. – Servy

+0

Sí, bien podrían serlo. Mencioné 'List' como una estructura de datos candidata en mi respuesta pero fui con' Dictionary' en la muestra del código porque no quería hacer esa suposición. –

1

Se puede poner sus PictureBoxes en una lista y luego acceder a ellos por el índice:

List<PictureBox> pbs = new List<PictureBox>(); 
foreach(Control c in this.Controls) if(c is PictureBox) pbs.Add((PictureBox)c); 

private void MakeMoleVisible(Int32 mole) { 
    pbs[ mole ] = // whatever 
} 
+0

Parece que 'mole' puede estar basado en 1, en cuyo caso puede ser necesario compensar el índice de la lista. –

+1

'pbs.AddRange (this.Controls.OfType ());' si va por un trazador de líneas al definir la lista en lugar de meter 3 en 1. –

3

Lo que difiere en el switch es la variable Pn. En lugar de poner los objetos en variables discretas, crear una matriz que pueda indexar en:

var p = new [] { p01, p02, .... } 

Y a continuación, el código puede tener este aspecto:

if (p[mole-1].Image == pmiss.Image && MoleHill.Image == pHill.Image) 
{ 
    molesmissed ++; 
} 
p[mole-1].Image = MoleHill.Image 
+0

... posiblemente con un poco de límites comprobando la seguridad . –

Cuestiones relacionadas