使用LINQ select过滤字典<string,string =“”>

时间:2016-04-13 14:37:46

标签: c# linq dictionary

我有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明确地按照我的预期运行,该功能没有问题(我们多年来一直在使用它)。问题是,whereselect都没有过滤掉错误结果。

人们一直想知道IsInRoles方法:

public static bool IsInRoles(CurrentUserInfo user, string[] roles, string siteName, bool hasAllRoles) {

3 个答案:

答案 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();