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

我想创建一个新列表,其中包含用户可以根据 List roleids 中的值访问的菜单

4

4 回答 4

7

如果您在roleids列表中进行初始选择 - 您可以利用字典的快速查找特性

var menuItems = roleids
    .Select(id => Links[id])
    .SelectMany(roles => roles)
    .Distinct();
于 2013-05-15T12:53:04.073 回答
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();
    }
于 2013-05-15T13:01:35.693 回答
0

尝试这个:

var distinct = Links
    .Where(i => roleids.Contains(i.Key))
    .SelectMany(i => i.Value).Distinct()
    .ToList();
于 2013-05-15T12:55:01.457 回答
0

首先检索用户角色 id角色 id 的链接,然后从此子集中选择值并避免使用distinct重复:

   var menus = Links.Where(l => roleids.Contains(l.key))
                     .SelectMany(k => k.Value)
                     .Distinct();
于 2013-05-15T12:58:46.890 回答