使用不带循环的LINQ查找部分字符串匹配

时间:2014-07-15 17:48:24

标签: c# string linq

问题:我正在搜索自定义Identity对象中的用户角色集合。角色有一个部门连接到他们,所以角色不仅仅是"角色"但是有一个"部门:角色"。

的模式

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

我正在使用LINQ执行此操作并使其正常工作(如下所示),但我想通过删除foreach循环来简化它,如果可能的话。我现在在网上看了几个小时,尝试了很多不同的解决方案。最接近我想要完成的两个似乎是herehere。也许答案就在那些内容中,我只是不喜欢它。

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

我的代码:

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;
}

2 个答案:

答案 0 :(得分:2)

如果你可以使用列表而不是数组,你可以尝试这样的事情。

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

答案 1 :(得分:1)

我想我可能会把它归结为一个单独的退货声明,但我没有引用&#34; CustomIdentityClass&#34;所以我无法为你测试。

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();
}