使用Lambda Expression

时间:2018-03-27 10:13:00

标签: c# list linq lambda foreach

在groupBox控件中,有四个checkBox元素,它们的标签名称为1,2,3,4。选中checkBox1,checkBox3和checkBox4。这是截图:

enter image description here

我想将选定的复选框项标记添加到列表项。 我试过这样:

private void button1_Click(object sender, EventArgs e)
{
    List<int> filter = new List<int>();

    var add_tags = groupBox1.Controls.OfType<CheckBox>().Where(cb => cb.Checked).ForEach(cbx => filter.Add(Convert.ToInt32(cbx.Tag)));

}

但它返回错误,我不明白错误。

以下是截图:

enter image description here

2 个答案:

答案 0 :(得分:3)

如果你想在列表中选择所有选中的复选框标签,那么你可以这样做,现在你没有使用Select以外的功能

 List<int> filter = groupBox1.Controls.OfType<CheckBox>()
                      .Where(cb => cb.Checked)
                     .Select(cbx => Convert.ToInt32(cbx.Tag))
                     .ToList();

假设所有标签都是int。

如果你想避免任何与错误相关的解析,你可以试试这个

 List<int> filter = groupBox1.Controls.OfType<CheckBox>()
                             .Where(cb => cb.Checked)
                             .Select(cbx => parseTag(cbx.Tag.toString()))
                             .ToList();

private int parseTag(string tag) 
{   
  int num;   
  if (!Int32.TryParse(tag, out num)) 
  {
    num = int.MaxValue; // or int.MinValue - however it should show up in sort   
  }
  return num; 
}

答案 1 :(得分:1)

稍微修改你的代码,这必须有效:

groupBox1.Controls.OfType<CheckBox>().Where(cb => 
cb.Checked).ToList().ForEach(cbx => filter.Add(Convert.ToInt32(cbx.Tag)));

不要将它分配给变量ForEach(表达式链中最后一个被调用的方法)不返回值,它只是做某事(Action)和您已添加到filter列表。