2013-05-15 4 views
0

У меня есть список, содержащий ролификаторы и словарь, который имеет базу данных ролей и меню, доступных для этой роли.Список коллекций и словарь

Предположим, что у пользователя есть роль 1,2,3, то как мне получить отдельные меню, которые он может получить из словаря?

List<int> roleids = new List<int>(); 

roleids.Add(1); 
roleids.Add(2); 
roleids.Add(3); 

Dictionary<int, List<String>> Links = new Dictionary<int, List<string>> 
{ 
    { 1, new List<String> { "Home", "About Us", "Logout", "Help" } }, 
    { 2, new List<String> { "Home", "Products", "Logout", "Help" } }, 
    { 3, new List<String> { "Home", "Customers", "Users", "Help" } } 
}; 

Я хочу, чтобы создать новый список, который содержит меню, доступные для пользователя на основе значений в Список roleids

+0

Спасибо большое за ваши ответы – user2381733

ответ

7

Если вы делаете ваш первоначальный выбор по roleids списка - вы можете использовать в быстро подстановок характер словарь

var menuItems = roleids 
    .Select(id => Links[id]) 
    .SelectMany(roles => roles) 
    .Distinct(); 
+0

+1 использует словарные ключи, как они должны. Эффективное. –

+0

@Dave Bish вы можете объяснить, как работает SelectMany (role => role). Я имею в виду, что роли ссылаются на какую коллекцию – user2381733

+1

После первого выбора вы получаете список списков (из словаря). SelectMany выравнивает все эти списки в один большой список (с дубликатами), которые затем удаляются с помощью функции Distinct() –

0

Попробуйте это:

var distinct = Links 
    .Where(i => roleids.Contains(i.Key)) 
    .SelectMany(i => i.Value).Distinct() 
    .ToList(); 
+1

Этот способ позволяет избежать быстрого поиска словаря –

0

Retri Накануне сначала Ссылки где Идентификатор роли в roleids пользователя, затем выберите из этого подмножества значений, и избежать дубликатов с отчетливым:

var menus = Links.Where(l => roleids.Contains(l.key)) 
        .SelectMany(k => k.Value) 
        .Distinct(); 
0

использование этого алгоритма

public static List<string> GetMenuItems(List<int> userRoles) 
    { 
     var roleids = new List<int>(); 
     roleids.Add(1); 
     roleids.Add(2); 
     roleids.Add(3); 
     var Links = new Dictionary<int, List<string>>() 
     { 
      {1,new List<String> {"Home","About Us","Logout","Help"}}, 
      {2,new List<String>{"Home","Products","Logout","Help"}}, 
      {3,new List<String>{"Home","Customers","Users","Help"}} 
     }; 
     var roleLinks = Links 
      .Where(item => userRoles.Contains(item.Key)) 
      .SelectMany(item => item.Value) 
      .ToList() 
      .Distinct(); 
    } 
Смежные вопросы