我一次又一次地发现自己需要遍历列表/集合以单独处理每个项目,并检查是否至少处理了一个项目。例如,如果我有一个"创建用户"方法来查看需要将哪些"用户角色"添加到用户(通过勾选一些复选框(,我会得到如下所示的内容:
foreach (CheckBox in CheckBoxRepeater)
{
if (CheckBox.Checked)
{
userRoles.Add(SomeUserRole);
foundOne = true;
}
}
if (foundOne)
{
//Do something else
}
我的问题是:上面的foreach和if语句可以以某种方式组合吗? 还是最佳做法是使用布尔值(在上面的示例中 = 'foundOne'(来跟踪项目是否已处理?
谢谢!
你可以尝试使用Linq,前提是userRoles
是一个List<T>
:
// Data to work with - filtered items
var data = CheckBoxRepeater
.Where(checkBox => checkBox.Checked);
// Add all the items into a List<T> - userRoles
userRoles.AddRange(data);
// Do we have any items filtered?
if (data.Any())
{
...
}
我会使用Any()
bool foundOne = CheckBoxRepeater.Any(x => x.Checked);
if(foundOne)
{
userRoles.Add(SomeUserRole);
//do some stuff
}
为什么要循环检查条件,为什么不只处理复选框Checked
事件,这实际上取决于您正在处理的内容 ASP.NET,Winform,WPF或其他任何内容并在那里执行操作。
顺便说一句,您的第二个子条件if (foundOne)
无关紧要,因为您可以在if (CheckBox.Checked)
本身内部执行逻辑
您可以使用事件。
因此,每个复选框都有一个 CheckedChanged 事件的侦听器,编写一个 OnCheckedChanged 回调,并让此回调将元素添加到列表中。 foundOne 是一个 getter,当此列表的计数> 0 时返回 true。
假设userRoles
在 foreach 循环之前为空:
userRoles.AddRange(CheckBoxRepeater.Where(x => x.Checked));
if (userRoles.Count > 0)
{
//Do something else
}