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语句中,这样我的代码可以更高效**
答案 0 :(得分:9)
看起来您的情况用于选择图像,然后您始终对图像应用相同的处理。
如何将图像存储在列表或词典中,使用mole
值来检索正确的图像,然后处理该图像?
像
这样的东西Dictionary<int, PictureBox> images;
var image = images[mole];
// do stuff to image
如果图像都按顺序编号,则List略高一些。请记住,列表索引是基于0。如果您的图像编号为1,就像switch
语句中的情况一样(在以下示例中假设),请记住相应调整。
List<PictureBox> images;
int index = mole - 1; // Assumes mole starts with 1, so adjust to 0-based index
var image = images[index];
答案 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
答案 2 :(得分: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
}
答案 3 :(得分: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;
}
}