ForEach 中的 C# 条件表示至少已处理一个项目



我一次又一次地发现自己需要遍历列表/集合以单独处理每个项目,并检查是否至少处理了一个项目。例如,如果我有一个"创建用户"方法来查看需要将哪些"用户角色"添加到用户(通过勾选一些复选框(,我会得到如下所示的内容:

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
}

最新更新