C# Foreach循环仅读取最后一项
如果他们的代码在列表中,我需要代码选中复选框,如果不在列表中,则取消选中。foreach循环只读取列表中的最后一项。 因此,如果最后一项是WNM,则即使列表中有其他匹配项,也只会选中WNM复选框。列表中只有一行字符串 守则:C# Foreach循环仅读取最后一项,c#,list,foreach,C#,List,Foreach,如果他们的代码在列表中,我需要代码选中复选框,如果不在列表中,则取消选中。foreach循环只读取列表中的最后一项。 因此,如果最后一项是WNM,则即使列表中有其他匹配项,也只会选中WNM复选框。列表中只有一行字符串 守则: foreach (string k in list) { if (k == "BGN") { CBBGN.Checked = true; } else { CBBGN.C
foreach (string k in list)
{
if (k == "BGN")
{
CBBGN.Checked = true;
}
else { CBBGN.Checked = false; }
if (k == "LAN")
{
CBLan.Checked = true;
}
else
{
CBLan.Checked = false;
}
if (k == "FGN")
{
CBFGN.Checked = true;
}
else
{
CBFGN.Checked = false;
}
if (k == "WNM")
{
CBWNM.Checked = true;
}
else
{
CBWNM.Checked = false;
}
if (k == "GGN")
{
CBGGN.Checked = true;
}
else
{
CBGGN.Checked = false;
}
}
您在循环上迭代,每次迭代都撤消进行该循环的迭代,因为它将命中该项的每个
if
语句的false
一个更好的结构是将所有Checked
状态最初设置为false
。然后迭代列表,仅将列表中出现的Checked
状态设置为true
,但不要将其设置为false
您也可以这样做,这更易于阅读。如果列表很大,您可以使用哈希集来提高性能。(谢谢@AlexeiLevenkov)
原始修复
CBBGN.Checked = false;
CBLan.Checked = false;
CBFGN.Checked = false;
CBWNM.Checked = false;
CBGGN.Checked = false;
foreach (string k in list)
{
if (k == "BGN")
CBBGN.Checked = true;
if (k == "LAN")
CBLan.Checked = true;
if (k == "FGN")
CBFGN.Checked = true;
if (k == "WNM")
CBWNM.Checked = true;
if (k == "GGN")
CBGGN.Checked = true;
}
您在循环上迭代,每次迭代都撤消进行该循环的迭代,因为它将命中该项的每个
if
语句的false
一个更好的结构是将所有Checked
状态最初设置为false
。然后迭代列表,仅将列表中出现的Checked
状态设置为true
,但不要将其设置为false
您也可以这样做,这更易于阅读。如果列表很大,您可以使用哈希集来提高性能。(谢谢@AlexeiLevenkov)
原始修复
CBBGN.Checked = false;
CBLan.Checked = false;
CBFGN.Checked = false;
CBWNM.Checked = false;
CBGGN.Checked = false;
foreach (string k in list)
{
if (k == "BGN")
CBBGN.Checked = true;
if (k == "LAN")
CBLan.Checked = true;
if (k == "FGN")
CBFGN.Checked = true;
if (k == "WNM")
CBWNM.Checked = true;
if (k == "GGN")
CBGGN.Checked = true;
}
如果要通过查找列表中是否有元素来控制复选框,只需使用Linq:
CBBGN.Checked = list.Any(s => s == "BGN");
CBLan.Checked = list.Any(s => s == "LAN");
CBFGN.Checked = list.Any(s => s == "FGN");
CBWNM.Checked = list.Any(s => s == "WNM");
CBGGN.Checked = list.Any(s => s == "GGN");
按照Alexei的建议和Igor的演示,使用哈希集当然会更好地提高性能和可读性。如果您想通过查找列表中是否有元素来控制复选框,只需使用Linq:
CBBGN.Checked = list.Any(s => s == "BGN");
CBLan.Checked = list.Any(s => s == "LAN");
CBFGN.Checked = list.Any(s => s == "FGN");
CBWNM.Checked = list.Any(s => s == "WNM");
CBGGN.Checked = list.Any(s => s == "GGN");
按照Alexei的建议和Igor的演示,使用哈希集当然会更好地提高性能和可读性。检查带有断点的列表以查看长度。
列表是如何生成的?列表中只有一行字符串。
您希望发生什么?如果列表中的最后一项是“WNM”,它将取消选中所有其他复选框。断点是您最好的朋友…请检查带有断点的列表以查看长度。list
是如何生成的?列表中只有一行字符串。
您希望发生什么?如果列表中的最后一项是“WNM”,它将取消选中所有其他复选框。断点是您最好的朋友…请使用更适合此处的开关CBBGN.Checked=list.Contains(“BGN”)
可能更容易阅读,如果list
是HashSet
它也会有相同的性能。我删除了我的评论,因为我更好地了解了OP的情况,并同意修改后的答案。使用更适合这里的开关CBBGN.Checked=list.Contains(“BGN”)
可能更容易阅读,如果列表
是哈希集
,它也会有相同的性能。我删除了我的评论,因为我更好地了解了OP的情况,并同意修改后的答案。