使用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。如果这能澄清什么,请告诉我