如何将所有案例合并为一个?

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;

我有36个这样的case语句,每一个都是针对不同的图片框;如何将它们全部组合成一个case语句,以使我的代码更加高效?


人们已经表达了以下观点,但是将图片对象(即p01、p02)作为参数传递给函数,并“foreach”鼹鼠图片调用该函数如何? - contactmatt
4个回答

9

看起来你的情况是用于选择图像,然后总是对图像应用相同的处理。

那么将图像存储在列表或字典中,使用mole值检索正确的图像,然后处理该图像如何?

类似以下方式:

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

如果图片都按顺序编号,使用列表会更加高效。请记住,列表索引是从0开始的。如果您的图片从1开始编号(在以下示例中假定),请相应地进行调整。

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

在一个 for 循环中滚过鼹鼠。 - bluevector
2
它们看起来都是连续的整数键,因此使用List比使用Dictionary更合理。 - Servy
是的,它们很可能是。我在回答中提到了List作为候选数据结构,但在代码示例中选择了Dictionary,因为我不想做出那个假设。 - Eric J.
@Servy:更新为更明确的内容。 - Eric J.

3

switch 语句中不同的是 pN 变量。不要把这些对象放在离散的变量中,而是创建一个数组,可以通过索引来访问:

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

然后你的代码可以像这样:

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

可能需要一些边界检查以确保安全。 - Sean McSomething

1
您可以将PictureBox放入列表中,然后通过索引访问它们:
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
}

看起来mole可能是以1为基准,如果是这样的话,可能需要对列表索引进行偏移。 - Eric J.
1
如果您想在定义列表时使用一行代码而不是将3个代码压缩到1个中,请使用以下代码:pbs.AddRange(this.Controls.OfType<PictureBox>()); - Austin Salonen

0

试试这个:

        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.ToString("00") -> "01" - Austin Salonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接