2013-12-08 60 views
3

我有7个单选按钮和5个复选框。这是如果选择第一个单选按钮并选择第一个复选框以及其他选项的代码。这仅在第一个复选框被选中时才起作用。这意味着我已经为每个复选框重新创建了这一点。如果有意义的话,这是第一个单选按钮。我意识到这样做只会是一大堆代码。它会工作,但它会非常草率。有没有办法可以使用数组或其他方法来减少代码?

所以,我想知道是否有某种方式,我可以在一个阵列或者其他什么东西做到这一点?我只是想缩短这一点很多。任何帮助,将不胜感激。谢谢。

if (radBrick.Checked) 
{ 
    intBrick = 100000; 
    intTotal = intBrick; 

    if (chkBasketball.Checked) 
    { 
     intBasketball = 50000; 
     intTotal = intBrick + intBasketball; 

     if (chkFire.Checked) 
     { 
      intFire = 500; 
      intTotal = intBrick + intBasketball + intFire; 

      if (chkMarble.Checked) 
      { 
       intMarble = 20000; 
       intTotal = intBrick + intBasketball + intFire + intMarble; 

       if (chkSteel.Checked) 
       { 
        intStain = 10000; 
        intTotal = intBrick + intBasketball + intFire + intStain + intMarble; 

        if (chkGarage.Checked) 
        { 
         intGarage = 5000; 
         intTotal = intBrick + intBasketball + intFire + intStain + intMarble + intGarage; 
        } 
       } 
      } 
     } 
    } 

    lblTotal.Text = intTotal.ToString("C"); 
} 
+0

执行值改变,如果选择其他单选按钮各一个单选按钮? – acfrancis

+0

是的,我想为多个单选按钮。和唯一值改变是intBrick。一切都保持不变 – Travis

+0

还有一些叫做CheckBoxList&RadioButtonList类。 – Pankaj

回答

6

是的,你可以 - 这里是如何:

int[] add = new[] {100000, 50000, 500, 20000, 10000, 50000}; 
bool[] check = new[] {radBrick.Checked, chkBasketball.Checked, chkFire.Checked, chkMarble.Checked, chkSteel.Checked, chkGarage.Checked}; 
int sum = 0; 
for (int i = 0 ; i != add.Length ; i++) { 
    if (check[i]) { 
     sum += add[i]; 
    } 
} 
+1

这里的缺点是'add []'和'check []'数组之间的耦合变得非常脆弱,并且依赖于它们的索引来完全匹配。或者,可以将复选框及其相应的值放入字典中,然后进行求和。我用字典提供了[备用答案](http://stackoverflow.com/a/20448648/9664)。 –

+0

@MetroSmurf当你对两个数组进行硬编码时,这绝不是问题。 – dasblinkenlight

2

尝试转化Checked属性为0或1 int值,并乘以该次的固定电话号码,并添加了一切。或多或少是这样的:

intBrick = 100000; 
intBasketball = 50000; 
intFire = 500; 
intMarble = 20000; 
intStain = 10000; 
intGarage = 5000; 

intTotal = (radBrick.Checked ? 1 : 0) * (intBrick + 
      (chkBasketball.Checked ? 1 : 0) * (intBasketball + 
      (chkFire.Checked ? 1 : 0) * (intFire + 
      (chkFire.Checked ? 1 : 0) * (intMarble + 
      (chkStain.Checked ? 1 : 0) * (intStain + 
      (chkGarage.Checked ? 1 : 0) * intGarage))))); 
+0

一个迟到的想法是,没有一个答案(包括我的)完全对应你嵌套的“if”。它们更像独立的顺序“if”。如果你需要嵌套,你可以在我的解决方案中使用额外的括号。 – acfrancis

+0

我已经用嵌套圆括号更新了我的答案,以匹配问题中的嵌套“if”。 – acfrancis

+0

@ ERTI-ChrisEelmaa,没有更广泛的范围(其中只有OP了),很难知道它是否是一个很好的解决了问题或不。随意发表你自己的建议的答案。 – acfrancis

0

假设要求是总所有值的值为true的选中状态,你可以放置CheckBox'es及其相应的数值,一本字典,然后使用LINQ总结值:

var dic = new Dictionary<CheckBox, int> 
{ 
    { chkBasketball, 50000 }, 
    { chkFire, 500 }, 
    { chkMarble, 20000 }, 
    { chkSteel, 10000 }, 
    { chkGarage, 5000 }, 
}; 

int sum = dic.Where(x => x.Key.Checked).Sum(x => x.Value); 
0

这是我的方法。

int CalculateTotal (RadioButton radioButton, int currentTotal) 
{ 
    if (radioButton.Checked) 
     return 0; 

    var elements = new[] 
     { 
      new 
       { 
        CheckBoxButton = chkFire, 
        Value = 50000 
       }, 

      new 
       { 
        CheckBoxButton = chkMarbled, 
        Value = 500 
       } 

      // and so on 
     }; 

    return currentTotal + elements.TakeWhile(x => x.CheckBoxButton.Checked).Sum(x => x.Value); 
} 

,并为将要使用它作为

lblTotal.Text = CalculateTotal(chkBasketBall , 50000).ToString(); 
+0

很高兴看到可以用来攻击这样一个简单问题的各种解决方案。 – acfrancis

相关问题