使用Lambda表达式查询C#字典

使用Lambda表达式查询C#字典,c#,linq,dictionary,lambda,C#,Linq,Dictionary,Lambda,假设我有一本声明词典: private static Dictionary<int, List<Models.APIAccessControl>> _APIRights = GetAPIRights(); 我正在尝试检查用户是否有权访问此api。 我的想法是查询字典并获取角色的所有APIAccessControl列表,然后查询这些APIAccessControl列表以查找他尝试导航的APIActionRoute: 我得到了包含我想要的角色列表的字典值,但是如何转换要列

假设我有一本声明词典:

 private static Dictionary<int, List<Models.APIAccessControl>> _APIRights = GetAPIRights();
我正在尝试检查用户是否有权访问此api。 我的想法是查询字典并获取角色的所有APIAccessControl列表,然后查询这些APIAccessControl列表以查找他尝试导航的APIActionRoute:

我得到了包含我想要的角色列表的字典值,但是如何转换要列出的值列表并进行此查询:

public static bool CanAccess(int[] roleIDs, APIActionRoute apiActionRoute)
   {
            bool canAccess = false;

            var apiAccessList = _APIRights.Where(x => roleIDs.Contains(x.Key)).Select(x => new { x.Value}).ToList();

      //Querying to get all List<Models.APIAccessControl> that has any matchig   APIActionRoute
    }
publicstaticboolcanaccess(int[]roleIDs,APIActionRoute-APIActionRoute)
{
bool-canAccess=false;
var apiAccessList=_APIRights.Where(x=>roleIDs.Contains(x.Key)).Select(x=>new{x.Value}).ToList();
//查询以获取具有任何匹配APIActionRoute的所有列表
}

最好先迭代角色ID,以利用字典查找

bool canAccess = false;
foreach(var roleId in roleIDs)
{
    List<Models.APIAccessControl> controls;
    if(_APIRights.TryGetValue(roleId, out controls))
    {
        canAccess = controls.Any(control => control.ActionRoute.Equals(apiActionRoute));
        if(canAccess)
            break;
    }
}

最好先迭代角色ID,以利用字典查找

bool canAccess = false;
foreach(var roleId in roleIDs)
{
    List<Models.APIAccessControl> controls;
    if(_APIRights.TryGetValue(roleId, out controls))
    {
        canAccess = controls.Any(control => control.ActionRoute.Equals(apiActionRoute));
        if(canAccess)
            break;
    }
}

听起来您希望
选择many
,它将“列表列表”投影到单个列表中:

var apiAccessList =
   _APIRights
   .Where(x => roleIDs.Contains(x.Key))
   .SelectMany(x => x.Value)
   .ToList();

然后,您将在一个大列表中包含每个
APIAccessControl
对象。不过,它将不再按roleID进行分组。它也可能有重复项,这可能很重要,也可能无关紧要。

听起来您希望
选择many
,将“列表”投影到单个列表中:

var apiAccessList =
   _APIRights
   .Where(x => roleIDs.Contains(x.Key))
   .SelectMany(x => x.Value)
   .ToList();

然后,您将在一个大列表中包含每个
APIAccessControl
对象。不过,它将不再按roleID进行分组。它也可能有重复项,这可能很重要,也可能无关紧要。

您可以修改Select子句以提供所需的列表:

var apiAccessList = _APIRights.Where(x => roleIDs.Contains(x.Key))
    .SelectMany(x => x.Value).ToList();

通过不选择匿名类并使用
SelectMany
,列表将为
Models类型。APIAccessControl
您可以修改Select子句以提供所需的列表:

var apiAccessList = _APIRights.Where(x => roleIDs.Contains(x.Key))
    .SelectMany(x => x.Value).ToList();

通过不选择匿名类和使用SelectMany,列表将为Models类型。我认为SelectMany可能会有所帮助

public static bool CanAccess(int[] roleIDs, APIActionRoute apiActionRoute)
{
    return _APIRights.Where(x => roleIDs.Contains(x.Key))
        .SelectMany(x => x.Value)
        .Any(a => a.ActionRoute == apiActionRoute);
}

我认为许多人可能会有所帮助

public static bool CanAccess(int[] roleIDs, APIActionRoute apiActionRoute)
{
    return _APIRights.Where(x => roleIDs.Contains(x.Key))
        .SelectMany(x => x.Value)
        .Any(a => a.ActionRoute == apiActionRoute);
}

您可以尝试使用Dictionary的Values属性提取列表。您是否可以提供用于执行强制转换和查询的示例代码,我正在尝试以优雅、干净的方式编写它。所以,如果你有任何想法,请分享你的代码。感谢您必须使用apiAccessList上的循环来获取所有ActionRoutes并将它们添加到列表中。还有其他选择。你唯一能做的就是使用Linq。让我知道,如果这澄清了任何事情,你可以尝试使用Dictionary的Values属性提取列表。你能提供用于执行强制转换和查询的示例代码吗,我正在尝试以优雅、干净的方式编写它。所以,如果你有任何想法,请分享你的代码。感谢您必须使用apiAccessList上的循环来获取所有ActionRoutes并将它们添加到列表中。还有其他选择。你唯一能做的就是使用Linq。如果这能澄清什么,请告诉我