我有Dictionary<string, string>
名为roleList
。在这种情况下,roleList
会在层次结构中列出该角色正上方的角色和角色 - 我需要同时保存匹配&#39;键的项目的键和值。角色,可以丢弃其余的。
我也可以访问以前编写过的函数,如果用户处于特定角色(或角色数组)(它只返回一个布尔值),我会告诉我,但我不知道是什么角色user in,因为用户可能拥有多个角色。
同样,我需要知道用户是否处于特定角色。
如果不使用For Each
迭代字典,我目前有:
roleList.Select(x => IsInRoles(userInfoObj, new string[] {x.Key}) == true).ToList();
请注意IsInRoles(params)
返回一个布尔值。另请注意,userInfoObj
只是在其他位置定义的自定义对象,我实际上无法控制它。
上述语句总是无法过滤掉IsInRoles
返回false的语句。我应该改变什么?
更新:根据评论,我尝试了普通.Where
选项并明确说明...IsInRoles(...) == true
。它仍然无法过滤列表。我还明确检查了更高的角色是否包含更低的角色(他们没有)。要明确:
roleList.Where(x => IsInRoles(userInfoObj, new string[] {x.Key}) == true).ToList();
和
roleList.Where(x => IsInRoles(userInfoObj, new string[] {x.Key})).ToList();
两者都失败了。也就是说,我在字典中有4个项目,4个出来。测试IsInRoles
明确地按照我的预期运行,该功能没有问题(我们多年来一直在使用它)。问题是,where
和select
都没有过滤掉错误结果。
人们一直想知道IsInRoles方法:
public static bool IsInRoles(CurrentUserInfo user, string[] roles, string siteName, bool hasAllRoles) {
答案 0 :(得分:2)
.Select
不会过滤集合。它返回原始集合的投影 - 新类型或转换为相同类型的新值。 Where
用于过滤集合或投影。
但是,您需要捕获Where
的结果以获取过滤后的值:
var roles = roleList.Where(x => IsInRoles(userInfoObj, new string[] {x.Key}));
或
var roles = roleList.Where(x => IsInRoles(userInfoObj, new string[] {x.Key}))
.ToList();
如果您想将结果水合成清单。
您似乎认为在没有将其分配给变量的情况下已经看到它工作,但Where
返回过滤集合的迭代器。如果您没有捕获该返回值,那么它就会丢失。它当然不会就地过滤原始集合。
答案 1 :(得分:1)
您可以使用以下内容:
Rails.application.config.assets.precompile << /\.(?:svg|eot|woff|ttf|jpg|png)\z/
Rails.application.config.assets.precompile += ['styles.css', 'careers.css', 'team.css', 'home.css', 'services.css', 'contacts.css']
var roles = roleList.Where(x => IsInRoles(userInfoObj, new string[] {x.Key}))
.Select(r => r.Key).ToList();
是一个包含用户角色的列表。
roles
只接受密钥,即您想知道的角色。
Select(r => r.Key)
返回一个结果已过滤的列表。
答案 2 :(得分:0)
如果您只想保留该键的指定键和值,只需执行此操作
即可string key = the 'key' role;
string val = roleList[temp1]; //save the key vand value
roleList.Clear (); //clear all values
roleList.Add (key, val); // add the key and value back
如果你使用Select(),因为它是一个函数,你必须将结果分配回roleList(但它仍然没有效率)
roleList = roleList.Select(x => IsInRoles(userInfoObj, new string[] {x.Key}) == true).ToList();