检查列表中是否存在值 - 比循环更好的方法?

时间:2013-04-15 14:33:40

标签: c# asp.net .net

我有以下类数据结构:

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开头的所有内容)

我想检查用户是否可以在“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
  }
}

有没有更好的方法来摆脱循环呢?或者我做得对吗?

3 个答案:

答案 0 :(得分: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"));

答案 1 :(得分:4)

您可以使用Enumerable.Any

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

答案 2 :(得分:1)

我不确定使用任何inbuild方法,但我仍然按照你的方式,任何代码将最终只使用foreach逻辑,没有神奇的方法。即使用代替foreach也会更快。我仍然会以你的方式投票,因为它会给你更多的力量。使用像LINQ这样的任何方法都很好但是for循环是最好的。