C# 如何在LINQ的Select子句中添加条件,根据WinForm复选框状态控制字段显示
问题原因
- LINQ 投影表达式中不能直接使用
if语句作为值返回,需要使用C#三元条件运算符?:实现条件判断。 - WinForm 的
CheckBox控件的勾选状态属性是Checked(首字母大写),你代码中写的小写checked会报编译错误。
正确实现代码
推荐使用多行lambda写法,提前提取公共值避免重复读取单元格,可读性和性能都更好:
var lstInfo = grdBreakDown.Rows.Cast<DataGridViewRow>() .Where(x => !x.IsNewRow) .Select(x => { string tag = x.Cells["tag"].Value.ToString(); string scheme = x.Cells["Scheme"].Value.ToString(); string value = x.Cells["Value"].Value.ToString(); // 校验当前Scheme对应的复选框是否勾选 bool isShow = (scheme == "Master" && cbxMaster.Checked) || (scheme == "Admin" && cbxAdmin.Checked); return ( tag: tag, Scheme: isShow ? scheme : string.Empty, Value: isShow ? value : string.Empty ); }) .Distinct() .ToList(); // 绑定ListView逻辑无需修改 lvwInfo.Items.AddRange( lstInfo .Select(x => new ListViewItem(new string[] { x.tag, x.Scheme, x.Value })) .ToArray() );
如果你偏好和你原有写法更接近的单行表达式写法,也可以使用如下实现:
.Select(x => ( tag: x.Cells["tag"].Value.ToString(), Scheme: ((x.Cells["Scheme"].Value.ToString() == "Master" && !cbxMaster.Checked) || (x.Cells["Scheme"].Value.ToString() == "Admin" && !cbxAdmin.Checked)) ? "" : x.Cells["Scheme"].Value.ToString(), Value: ((x.Cells["Scheme"].Value.ToString() == "Master" && !cbxMaster.Checked) || (x.Cells["Scheme"].Value.ToString() == "Admin" && !cbxAdmin.Checked)) ? "" : x.Cells["Value"].Value.ToString() ))
内容的提问来源于stack exchange,提问作者asmgx
相关产品推荐
相关产品推荐

