Foreach循环只读取最后一项

时间:2017-04-12 19:46:10

标签: c# list foreach

如果代码在列表中,我需要代码来检查复选框,如果不在列表中,则需要取消选中。 foreach循环只读取列表中的最后一项。 因此,如果最后一项是WNM,则只检查WNM复选框,即使列表中包含其他匹配项。该列表中只有一行字符串。

代码:

    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;
        }
    }

2 个答案:

答案 0 :(得分:4)

您遍历循环并在每次迭代时撤消继续进行的迭代,因为它将达到该项目的每个false语句的if

最初将所有Checked个状态设置为false更好的结构。然后迭代列表并仅将Checked状态设置为true如果它出现在列表中但不将其设置为false

您也可以执行更易于阅读的操作,如果列表可能很大,您可以使用HashSet来提高性能。 (感谢@AlexeiLevenkov

CBBGN.Checked = list.Contains("BGN");
CBLan.Checked = list.Contains("LAN");
CBFGN.Checked = list.Contains("FGN");
CBWNM.Checked = list.Contains("WNM");
CBGGN.Checked = list.Contains("GGN");

原始修复

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;
}

答案 1 :(得分:1)

如果您想通过查找元素是否在列表中来控制复选框,只需使用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");

使用HashSet而不是由Alexei提出并由Igor展示当然会更好的性能和可读性。