【问题标题】:Collections list and dictionary收藏列表和字典
【发布时间】:2013-05-15 12:49:21
【问题描述】:

我有一个包含角色标识的列表和一个包含角色标识数据库和该角色标识可访问的菜单的字典。

假设用户具有角色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 中的值访问的菜单

【问题讨论】:

  • 非常感谢您的回答

标签: c# list collections dictionary


【解决方案1】:

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

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

【讨论】:

  • @Dave Bish 你能解释一下 SelectMany(roles=>roles) 的工作原理吗?我的意思是角色指的是哪个集合
  • 第一次选择后,您最终会得到一组列表(来自字典)。 SelectMany 将所有这些列表展平,变成一个大列表(有重复项) - 然后由 Distinct() 删除
  • 但是角色=>角色或任何变量 v=>v 在 linq 中的含义是什么。抱歉,如果这个问题很烦人,但我对这一切都很陌生
  • @DaveBish 你也能回答我之前发布的问题“无法编写 Linq 查询”
  • @user2381733 你还没有接受这个作为答案!
【解决方案2】:

试试这个:

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

【讨论】:

  • 这样避免了字典的快速查找
【解决方案3】:

首先检索用户角色ID中的where角色ID,然后从该子集中选择值并避免与distinct重复:

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

【讨论】:

    【解决方案4】:

    使用这个算法

    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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 2016-01-31
      • 2022-01-22
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      相关资源
      最近更新 更多