查找部分字符串匹配使用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;
}
如果您可以使用列表而不是数组,您可以尝试这样做。
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();
}