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

**对于不同的图片框,我有36个这样的case语句,我如何将它们全部组合成一个case语句,以便我的代码更高效**如何将所有案例合并为一个?

+0

人已经在下面表达了,但是如何将图片对象(即p01,p02)作为参数传递给函数,以及如何将“foreach”图片调用函数? – contactmatt

回答

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

考虑一下你的第一行:(ex)'1.ToString(“00”) - >“01”' –

+0

感谢这个人工作得最好。 –

9

看起来您的案例用于选择图像,然后您总是对图像应用相同的处理。

如何将图像存储在List或Dictionary中,使用mole值检索正确的图像,然后处理该图像?

喜欢的东西

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

如果图像被依次编号为所有,列表会更有效。请记住,列表索引是基于0的。如果您从switch声明(中假定的假设为)中看到的图像编号为1,请记住相应地进行调整。

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

并在'for'循环中遍历痣。 – bluevector

+2

它们看起来都是连续的整数键,所以'List'比'Dictionary'更有意义。 – Servy

+0

是的,他们很可能。我在我的回答中提到'List'作为候选数据结构,但是在代码示例中使用了'Dictionary',因为我不想做这个假设。 –

1

你可以把你的PictureBoxes到一个列表,然后通过索引来访问它们:

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

看起来像'mole'可能是基于1的,在这种情况下可能需要向列表索引提供偏移。 –

+1

'pbs.AddRange(this.Controls.OfType ());'如果你打算在定义列表的时候使用一行代码,而不是将数据填充到1中。 –

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 
+0

...可能有一些小小的边界来检查安全性。 –

相关问题