2013-04-15 2 views
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 может иметь значения, такие как «администратор», «пользователь», «суперпользователя» и т.д.

, так что каждый пользователь может иметь несколько орг-suborg комбинации с несколькими пользовательскими ролями для каждого.

Orgs и suborgs в пользовательском классе могут быть записаны следующим образом: 56% (что означает, что они могут видеть все, что начинается с 56)

Я хочу, чтобы проверить, если пользователь имеет доступ к орг-suborg комбинации на странице типа «Admin»

прямо сейчас я делаю это с помощью цикла, который работает, например, так:

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 
    } 
} 

есть лучший способ сделать это, чтобы избавиться от петли может быть ? или я делаю это правильно?

ответ

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

Это не избавляет от цикла, он просто скрывает его внутри «Любые (...)», предоставил его лучше, чем оригинал. –

+0

@StenPetrov: Конечно, но я подозреваю, что это то, что фактически ищет OP для. Учитывая, что есть много вещей, чтобы посмотреть, я не вижу, как вы могли бы ожидать, что когда-либо избавитесь от цикла. –

+0

Что делает OP, выглядит неправильно на многих уровнях, поэтому вы, скорее всего, правы. +1 –

4

Вы можете использовать Enumerable.Any:

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

Я не уверен, что с помощью любого inbuild метода, но я до сих пор идут по пути, любой код будет в в конце будет использоваться только логика foreach, нет волшебного пути. Даже использование вместо foreach будет намного быстрее. Я все равно буду голосовать так, как вы делаете, потому что это даст вам больше силы в руке. Использование любого метода, такого как LINQ, отлично, но для цикла является лучшим.