2017-04-12 139 views
0

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

代码:

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

使用断点检查列表以查看长度。 – Botonomous

+0

如何生成'list'? – Cameron

+0

'列表中只有一行字符串。“<=这是什么意思? “list”的确切内容是什么? – Igor

回答

4

您遍历循环,并在每次迭代您撤消继续它,因为它会打到每个if声明该项目的false迭代。

一个更好的结构将在开始时将所有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; 
} 
+0

使用开关更适合这里 –

+1

'CBBGN.Checked = list.Contains(“BGN”)'可能更容易阅读,如果列表'是'HashSet '它具有相同的性能。 –

+0

我删除了我的意见,因为我对OP的情况有了更好的阅读,并且同意修改后的答案。 –

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显示当然会更好的性能和可读性。

相关问题