检查list中value是否存在——这比循环要好

本文关键字:循环 存在 list value 是否 检查 | 更新日期: 2023-09-27 18:09:30

我有以下类数据结构:

public class clsUser
{
    public string userid { get; set; }
    public List<OrgPermission> orgs { get; set; }
}
public class OrgPermission
{
    public string Org { get; set; }
    public string SubOrg {get;set;}
    public List<string> type { get; set; }
}

List<string> type可以有admin、user、superuser等值

这样每个用户可以有多个org-suborg组合,每个组合有多个用户角色。

user类中的orgs和suborgs可以这样写:56%(这意味着他们可以看到所有以56开头的)

我想检查用户是否有权访问"Admin"类型页面上的org-suborg组合

现在我用一个循环来做,像这样:

foreach (OrgPermission userOrg in user.orgs) {
  if ((ddlOrg.SelectedValue.StartsWith(userOrg.Org.Trim('%'))) && (ddlSubOrg.SelectedValue.StartsWith(userOrg.SubOrg.Trim('%')))) {
    if (userOrg.type.Contains("Admin"))
      btnSubmitToProd.Enabled = true;
    else
      btnSubmitToProd.Enabled = false;
    break; //break out of the loop if the org-sub org match is found
  }
}

有没有更好的方法来摆脱循环呢?还是我做得对?

检查list中value是否存在——这比循环要好

听起来你想:

string orgValue = ddlOrg.SelectedValue;
string subOrgValue = ddlSubOrg.SelectedValue;
btnSubmitToProd = user.orgs
                      .Any(org => orgValue.StartsWith(org.Org.Trim('%')) &&
                                  subOrgValue.StartsWith(org.SubOrg.Trim('%')) &&
                                  org.type.Contains("Admin"));

您可以使用Enumerable.Any:

var userIsAdmin = user.orgs.Any(uo => uo.type.Any(uot => uot == "Admin"));

我不确定是否使用任何内置方法,但我仍然按照你的方式去做,任何代码将在最后只使用foreach逻辑,没有神奇的方法。甚至用for代替foreach也会快得多。我仍然会按照你们的方式投票,因为这将给你们更多的权力。使用任何像LINQ这样的方法都可以,但是for循环是最好的方法。