如果多个条件为真,如何创建运行多次的条件或 if 语句
How to create a conditional-OR if statement that runs multiple times if multiple conditions are true
现在我的代码有 52 个复选框,每个 return 都有自己的值。
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 语句。
将复选框的索引放入列表/数组中:
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());
我会创建一个 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]);
一个更好的方法来解决这个问题,IMO,是写一个特殊的 Yaku
class 用来保存列表中每个项目的信息。这将包括名称和分数(han)。它还会覆盖 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());
}
现在我的代码有 52 个复选框,每个 return 都有自己的值。
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 语句。
将复选框的索引放入列表/数组中:
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());
我会创建一个 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]);
一个更好的方法来解决这个问题,IMO,是写一个特殊的 Yaku
class 用来保存列表中每个项目的信息。这将包括名称和分数(han)。它还会覆盖 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());
}