查找部分字符串匹配使用LINQ无循环

本文关键字:LINQ 循环 串匹配 字符 字符串 查找部 | 更新日期: 2023-09-27 18:13:15

问题:我正在搜索自定义Identity对象内的用户角色集合。角色有一个连接到它们的部门,所以角色不仅仅是"role",而是具有"department: role"模式。

由于角色是在不知道"Department"部分的对象中定义的,因此在构建授权列表时需要忽略该部分。实际上,我在每个"Department:Role"项中寻找":Role"。

我正在使用LINQ来做到这一点,并使其工作(见下文),但我想通过删除foreach循环来简化它,如果可能的话。我在网上找了几个小时,尝试了许多不同的解决方案。最接近我想要实现的目标的两个地方似乎是这里和这里。也许答案就在这里面,而我只是没有说出来。

提前感谢您的帮助/建议。

我的代码:

protected static void AddObjectAuthorizationRules() {
    //Code that gets current user context...
    string[] pDefinedRoles = new string[] { "Developer", "Admin", "User" };
    List<string> _createRoles = ProcessAuthorizationRoles(pDefinedRoles, pIdentity);
    //Object authorization code that uses _createRoles...
}
private List<string> ProcessAuthorizationRoles(string[] pDefinedRoles, CustomIdentityClass pIdentity) {
    List<string> _allowRoles = new List<string>();
    foreach (var _role in pDefinedRoles) {
        var partial = string.Format(":{0}", _role);
        string[] tmp = (from r in pIdentity.Roles 
                        where r.Contains(partial) 
                        select r).ToArray();
        foreach (string found in tmp) {
            _allowRoles.Add(found);
        }
    }
    return _allowRoles;
}

查找部分字符串匹配使用LINQ无循环

如果您可以使用列表而不是数组,您可以尝试这样做。

private List<string> ProcessAuthorizationRoles(List<string> pDefinedRoles, CustomIdentityClass pIdentity)
{
    return pIdentity.Roles.FindAll(x => pDefinedRoles.Exists(y => x.Contains(string.format(":{0}", y))));
}

我想我可能会把它归结为一个单一的返回语句,但我没有对"CustomIdentityClass"的引用,所以我不能为你测试这个。

private List<string> ProcessAuthorizationRoles(string[] pDefinedRoles, CustomIdentityClass pIdentity)
{
    return (from role in (from r in pDefinedRoles
                          select new
                          {
                              Partial = string.Format(":{0}", r)
                          })
            from r in pIdentity.Roles
            where r.Contains(role.Partial)
            select r).ToList();
}