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

** Ich habe 36 dieser Fallaussagen jeder für eine andere Bildbox; Wie gruppiere ich sie alle in einer Fallanweisung, so dass mein Code effizienter sein kann **Wie füge ich alle Fälle in einen zusammen?

+0

Menschen habe das unten ausgedrückt, aber wie wäre es mit der Übergabe des Bildobjekts (zB p01, p02) als Argument an die Funktion, und "foreach" Maulwurfsbild, das die Funktion aufruft? – contactmatt

Antwort

0

testen:

 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

Betrachten Sie dies über Ihre erste Zeile: (ex) '1.ToString (" 00 ") ->" 01 "' –

+0

Danke dieser eine funktionierte am besten. –

9

Es sieht aus wie Ihr Fall verwendet wird, um ein Bild auszuwählen, dann wenden Sie immer die gleiche Verarbeitung auf das Bild.

Wie wäre es mit dem Speichern des Bildes in einer Liste oder einem Wörterbuch, verwenden Sie den mole Wert, um das richtige Bild abzurufen, und bearbeiten Sie dann dieses Bild?

So etwas wie

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

Wenn die Bilder alle fortlaufend nummeriert sind, ist eine Liste etwas effizienter. Denken Sie daran, dass Listenindizes 0 sind. Wenn Sie Ihre Bilder von 1 nummerieren, wie es bei Ihrer switch-Anweisung (, angenommen im folgenden Beispiel) der Fall zu sein scheint, denken Sie daran, entsprechend anzupassen.

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

Und rollen Sie durch die Maulwürfe in einer 'for' Schleife. – bluevector

+2

Sie scheinen alle sequentielle Integer-Keys zu sein, so dass eine 'List' mehr Sinn macht als ein' Dictionary'. – Servy

+0

Ja, sie könnten gut sein. Ich habe 'List' in meiner Antwort als Kandidaten-Datenstruktur erwähnt, bin aber im Codebeispiel mit' Dictionary' gegangen, weil ich diese Annahme nicht machen wollte. –

1

Sie könnten Ihre PictureBox in eine Liste setzen und sie dann durch den Index zugreifen:

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

Sieht so aus, als ob "mole" 1-basiert sein könnte. In diesem Fall kann ein Versatz zum Listenindex erforderlich sein. –

+1

'pbs.AddRange (this.Controls.OfType ());' Wenn Sie für eine Einzeiler bei der Definition der Liste statt statt 3 in 1 zu stopfen. –

3

Die Sache, die in den switch unterscheidet, ist das pN-Variable. Statt diese Objekte in diskreten Variablen setzen, erstellen Sie ein Array können Sie Index in:

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

Und dann können Sie Ihren Code wie folgt aussehen:

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

... möglicherweise mit ein wenig Grenzen für die Sicherheit zu überprüfen . –

Verwandte Themen