使用Lambda表达式向List添加选中CheckBox的Tag值问题
问题分析与解决方案
你这段代码的问题在于,Where方法返回的是IEnumerable<CheckBox>类型的序列,而ForEach是List<T>独有的实例方法,不是LINQ的扩展方法,所以你不能直接在IEnumerable结果上调用ForEach,这会导致编译错误。
给你两种解决思路,都能实现你想要的效果:
方法一:转成List后使用ForEach
先把筛选后的CheckBox序列转成List<CheckBox>,再调用ForEach来添加Tag值:
private void button1_Click(object sender, EventArgs e) { List<int> filter = new List<int>(); groupBox1.Controls.OfType<CheckBox>() .Where(cb => cb.Checked) .ToList() // 关键:把IEnumerable转成List .ForEach(cbx => filter.Add(Convert.ToInt32(cbx.Tag))); }
方法二:用LINQ直接生成List(更简洁推荐)
直接通过Select把选中的CheckBox的Tag转成int,再转成List,一步到位,代码更简洁也更符合LINQ的使用习惯:
private void button1_Click(object sender, EventArgs e) { List<int> filter = groupBox1.Controls.OfType<CheckBox>() .Where(cb => cb.Checked) .Select(cbx => Convert.ToInt32(cbx.Tag)) .ToList(); }
这样就能正确把选中的CheckBox的Tag值(1、3、4)收集到filter列表里啦~
内容的提问来源于stack exchange,提问作者user1372430
相关产品推荐
相关产品推荐

