3

我有以下类数据结构:

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 组合,每个组合具有多个用户角色。

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

我想检查用户是否有权访问“管理员”类型页面上的 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
  }
}

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

4

3 回答 3

7

听起来你想要:

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"));
于 2013-04-15T14:35:58.993 回答
4

您可以使用Enumerable.Any

var userIsAdmin = user.orgs.Any(uo => uo.type.Any(uot => uot == "Admin"));
于 2013-04-15T14:36:28.723 回答
1

我不确定是否使用任何 inbuild 方法,但我仍然按照您的方式进行,任何代码最终都将仅使用 foreach 逻辑,没有神奇的方法。即使使用 for 代替 foreach 也会快得多。我仍然会按照你的方式投票,因为它会给你更多的权力。使用 LINQ 之类的任何方法都可以,但 for 循环是最好的方法。

于 2013-04-15T14:39:33.833 回答