如何创建一个条件或if语句,在多个条件为真时运行多次

本文关键字:条件 运行 创建 何创建 一个 if 语句 | 更新日期: 2023-09-27 18:16:24

现在我的代码有52个复选框,每个复选框返回自己的值。

if (checkedListBox1.GetItemCheckState(0) == CheckState.Checked)
            {
                x += 1;
            }
if (checkedListBox1.GetItemCheckState(1) == CheckState.Checked)
            {
                x += 2;
            }
if (checkedListBox1.GetItemCheckState(2) == CheckState.Checked)
            {
                x += 1;
            }

我想把做同样事情的if语句组合成一个语句,就像

if (checkedListBox1.GetItemCheckState(0) == CheckState.Checked ||
    checkedListBox1.GetItemCheckState(2) == CheckState.Checked ||
    checkedListBox1.GetItemCheckState(17) == CheckState.Checked )
            {
                x += 1;
            }

但是这样的代码只会运行一次。在这种情况下,是否有一个操作符可以帮助我,或者我必须写52个if语句。

如何创建一个条件或if语句,在多个条件为真时运行多次

我将创建一个分数的int[]数组,每个可能的复选框有一个条目:

var scores = new []
{
    1,
    2,
    1,
    4,
    2,
    1,
    // Etc up to 52 items
};

然后你可以循环遍历所有的复选框并将所有的分数加起来:

for (int i = 0; i < checkedListBox1.Items.Count; ++i)
    if (checkedListBox1.GetItemCheckState(i)) == CheckState.Checked)
        x += scores[i];

您还可以使用CheckedListBox.CheckedIndices来遍历选中的项,如下所示:

x = checkedListBox1.CheckedIndices.Cast<int>().Sum(i=> scores[i]);

在我看来,一个更好的方法是编写一个特殊的Yaku类,用于保存列表中每个项目的信息。这将包括名字和分数(分数)。它还将覆盖ToString(),以便该名称将显示在列表中。

它可能看起来像这样:

public class Yaku
{
    public string Name { get; }
    public int    Han  { get; }
    public Yaku(string name, int han)
    {
        Name = name;
        Han  = han;
    }
    public override string ToString()
    {
        return Name;
    }
}

那么你就可以像这样初始化复选框:

public Form1()
{
    InitializeComponent();
    checkedListBox1.Items.Add(new Yaku("Little three dragons",  4));
    checkedListBox1.Items.Add(new Yaku("Terminal in each set",  3));
    checkedListBox1.Items.Add(new Yaku("Three closed triplets", 3));
}

然后像这样把分数加起来:

private void button1_Click(object sender, EventArgs e)
{
    int score = checkedListBox1.CheckedItems.OfType<Yaku>().Sum(item => item.Han);
    MessageBox.Show(score.ToString());
}

将复选框的索引放到列表/数组中:

using System.Linq;
...
var checkboxIndices = { 0, 2, 17 };
x += checkboxIndices.Count(index =>
         checkedListBox1.GetItemCheckState(index) == CheckState.Checked);

编辑:唉,我以为这很明显,但这里有更多的细节:

  class Yaku
   {
       public Yaku(List<int> indices, int han)
       {
           Indices = indices;
           HanValue = han;
       }
       public List<int> Indices;
       public int HanValue;
       public int ComputeValue(CheckedListBox checkedListBox)
       {
            return HanValue * Indices.Count(index =>
                checkedListBox.GetItemCheckState(index) == CheckState.Checked);
       }
   }
   ...
   var yakus = [
       new Yaku({0, 2, 17 }, 1),
       new Yaku({1}, 2)
       ...
   ];
   var totalYakuValue = yakus.Aggregate(yaku => yaku.ComputeValue());