7
votes

Comment fusionner-je tous les cas en un?

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;
** I have 36 of these case statements each one for another for a different picture box; how do I group them all into one case statement so my code can be more efficient**  

1 commentaires

Les gens ont exprimé ceci ci-dessous, mais que diriez-vous de passer l'objet image (c'est-à-dire P01, P02) comme un argument de la fonction et «foreach» image de la mole appelant la fonction?


4 Réponses :


9
votes

On dirait que votre cas est utilisé pour sélectionner une image, vous appliquez toujours le même traitement à l'image.

Comment diriez-vous de stocker l'image dans une liste ou un dictionnaire, utilisez le mole code> Valeur pour récupérer la bonne image, puis traiter cette image? p>

quelque chose comme p> xxx pré>

si les images sont toutes numérotées de manière séquentielle, une liste est légèrement plus efficace. . N'oubliez pas que les indices de liste sont 0. Si vous numérotez vos images de 1, comme cela semble être le cas de votre code> Switch code> ( supposé dans l'exemple suivant em>), n'oubliez pas de régler en conséquence. P>

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


4 commentaires

Et traversez les moles dans un pour boucle.


Ils cherchent à être toutes les clés entier séquentielles, donc une liste serait plus logique qu'un dictionnaire .


Oui, ils pourraient bien être. Je mentionne Liste en tant que structure de données candidates dans ma réponse, mais je suis allé avec Dictionnaire dans l'exemple de code parce que je ne voulais pas faire cette hypothèse.


@Servy: mis à jour pour être plus explicite.



1
votes

Vous pouvez mettre vos boîtes d'images dans une liste, puis y accéder par index: xxx


2 commentaires

On dirait que mole peut être basé sur 1, auquel cas décalage sur l'index de la liste peut être nécessaire.


pbs.addrange (this.controls.oftypepe ()); Si vous utilisez une doublure lors de la définition de la liste au lieu de grammer 3 en 1.



3
votes

La chose qui diffère dans le commutateur code> code> est la variable PN. Au lieu de mettre ces objets dans des variables discrètes, créez un tableau que vous pouvez indexer dans: xxx pré>

et ensuite votre code peut ressembler à ceci: p>

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


1 commentaires

... éventuellement avec un petit contrôle de la sécurité.



0
votes

Essayez ceci:

        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;
            }
        }


1 commentaires

Considérez ceci sur votre première ligne: (ex) 1.Tostring ("00") -> "01"