2012-07-02 26 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; 

** Ho 36 di queste dichiarazioni caso l'una per l'altra per una diversa finestra di immagine; come faccio a raggrupparli tutti in un'unica dichiarazione, quindi il mio codice può essere più efficiente **Come faccio a unire tutti i casi in Uno?

+0

persone ho espresso questo sotto, ma che ne dici di passare l'oggetto immagine (cioè p01, p02) come argomento alla funzione, e "foreach" immagine mole chiamando la funzione? – contactmatt

risposta

0

Prova questo:

 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

Considera questo sulla tua prima riga: (ex) '1.ToString (" 00 ") ->" 01 "' –

+0

Grazie a questo ha funzionato al meglio. –

9

Sembra che il caso sia utilizzato per selezionare un'immagine, quindi si applica sempre la stessa elaborazione all'immagine.

Per quanto riguarda la memorizzazione dell'immagine in un elenco o dizionario, utilizzare il valore mole per recuperare l'immagine corretta, quindi elaborare quell'immagine?

Qualcosa di simile

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

Se le immagini sono tutti numerati in sequenza, una lista è leggermente più efficiente. Ricorda che gli indici delle liste sono basati su 0. Se si numerano le immagini da 1 come sembra essere il caso dall'istruzione switch (assunta nell'esempio seguente), ricordarsi di regolare di conseguenza.

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

E rotolare attraverso le talpe in un ciclo 'for'. – bluevector

+2

Sembrano essere tutti i tasti in sequenza sequenziali, quindi un 'Elenco' avrebbe più senso di un' dizionario'. – Servy

+0

Sì, potrebbero benissimo essere. Ho menzionato 'List' come una struttura dati candidata nella mia risposta, ma ho usato' Dictionary' nell'esempio di codice perché non volevo fare questa ipotesi. –

1

Si potrebbe mettere le PictureBoxes in una lista e poi accedervi in ​​base all'indice:

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

Sembra che 'mole' possa essere basato su 1, nel qual caso può essere necessario sfalsare l'indice della lista. –

+1

'pbs.AddRange (this.Controls.OfType ());' se stai cercando un one-liner quando definisci l'elenco invece di cramming 3 in 1. –

3

La cosa che differenzia nel switch è la variabile pN. Invece di mettere quegli oggetti a variabili discrete, creare un array è possibile indicizzare in:

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

E poi il codice può assomigliare a questo:

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

... possibilmente con un piccolo limite per la sicurezza . –

Problemi correlati