【问题标题】:LINQ: How to filter list based on values from array [duplicate]LINQ:如何根据数组中的值过滤列表[重复]
【发布时间】:2020-09-01 21:17:01
【问题描述】:

如果数组中存在的角色已经包含在用户角色列表中,我想过滤用户数组。

这是我无法编译的代码:

var roles = role.Split(','); // admin, basic, super-admin

listOfUsers = listOfUsers.Where(user => user.Roles.Contains(roles.Select(x => x)).ToList();

如果 admin 和 basic 包含在 roles 中,我想这样做,这是一个字符串数组,仅返回那些在 Roles 数组中具有相同值的用户。 (角色也是字符串列表)但这会重现错误:

【问题讨论】:

  • 你能添加更多代码吗? listOfUsers 等的类型是什么? user.Roles 是什么类型?
  • 您是在寻找具有roles 中指定的所有角色的用户,还是在roles 中具有任何角色的用户?
  • @DavidFox 声明Roles 也是List<string>
  • @RufusL 对于在角色中指定了任何角色的用户。是的Roles 也是List<string>
  • 假设user.RolesIEnumerable<string>,那么user.Roles.Contains(roles.Select(x => x)) 期望string 作为参数。我们知道rolesstring[](假设role 是一个包含用逗号分隔的内容的字符串)。然后,roles.Select(x=>x)IEnumerable<string> 而不是函数期望的 string。如果您给我们更多代码(如@DavidFox 所建议)并且您的变量名不是rolerolesRoles,这会容易得多

标签: c# .net string linq split


【解决方案1】:

要从另一个字符串列表中查找匹配项,您可以检查Any 用户角色是否包含在roles 列表中:

listOfUsers = listOfUsers.Where(user => user.Roles.Any(roles.Contains)).ToList();

如果要进行不区分大小写的比较,可以将比较器传递给Contains 方法:

listOfUsers = listOfUsers
    .Where(user => 
        user.Roles.Any(role => roles.Contains(role, StringComparer.OrdinalIgnoreCase)))
    .ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多