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

** Mam 36 takich zestawień spraw dla każdego z nich dla innego pudełka z obrazkami; jak pogrupować je wszystkie w jedną instrukcję case, więc mój kod może być bardziej wydajny **Jak scalić wszystkie sprawy w One?

+0

People wyraziliśmy to poniżej, ale co powiemy na przekazanie obiektu obrazu (np. p01, p02) jako argumentu do funkcji i "foreach" obraz molowy wywołujący funkcję? – contactmatt

Odpowiedz

0

Spróbuj to:

 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

Rozważ to o swojej pierwszej linii: (ex) '1.ToString (" 00 ") ->" 01 "' –

+0

Dzięki temu zadziałało najlepiej. –

9

Wygląda na to, że do wybrania obrazu używana jest Twoja walizka, to zawsze stosujesz to samo przetwarzanie do obrazu.

Co zrobić z przechowywaniem obrazu na liście lub w słowniku, użyć wartości mole, aby pobrać poprawny obraz, a następnie przetworzyć ten obraz?

Coś

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

Jeśli obrazy są kolejno numerowane, lista jest nieco bardziej wydajny. Pamiętaj, że indeksy listy są oparte na 0. Jeśli numerujesz obrazy z 1, tak jak się wydaje, z Twojego oświadczenia switch (założonego w poniższym przykładzie), pamiętaj o odpowiednim dostosowaniu.

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

I przetocz przez mole w pętli 'for'. – bluevector

+2

Wyglądają na wszystkie sekwencyjne liczby całkowite, więc 'List' miałby większy sens niż" słownik ". – Servy

+0

Tak, mogą być. Wspominam o 'List' jako o strukturze danych kandydatów w mojej odpowiedzi, ale wybrałem słowo' Dictionary' w próbce kodu, ponieważ nie chciałem tego założyć. –

1

Można umieścić swoje PictureBoxes na liście, a następnie uzyskać do nich dostęp przez indeks:

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

Wygląda na to, że 'mole' może być oparty na 1, w którym to przypadku może być konieczne przesunięcie do indeksu listy. –

+1

'pbs.AddRange (this.Controls.OfType ());' jeśli wybierasz się na jedną linijkę podczas definiowania listy zamiast wkuwania 3 do 1. –

3

rzeczą, która różni się w switch jest zmienna PN. Zamiast umieszczać te obiekty w zmiennych dyskretnych, utworzyć tablicę Można indeksować do:

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

A potem kod może wyglądać następująco:

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

... prawdopodobnie z pewnym ograniczeniem sprawdzającym bezpieczeństwo . –