我有以下代码来检查userRoles集合是否具有authorizedRolesList中的任何值。如果用户角色名称具有空格,则它不起作用。
处理此问题最有效的LINQ
方法是什么?
法典
List<string> authorizedRolesList = null;
string AuthorizedRolesValues = "A, B ,C,D";
if (!String.IsNullOrEmpty(AuthorizedRolesValues))
{
authorizedRolesList = new List<string>((AuthorizedRolesValues).Split(','));
}
string userRoleName = String.Empty;
Collection<string> userRoles = new Collection<string>();
userRoles.Add("B ");
bool isAuthorizedRole = false;
if (userRoles != null)
{
foreach (string roleName in userRoles)
{
userRoleName = roleName.Trim();
if (authorizedRolesList != null)
{
//Contains Check
if (authorizedRolesList.Contains(userRoleName))
{
isAuthorizedRole = true;
}
}
}
}
参考:
- 何时使用 .首先和何时使用.FirstOrDefault with LINQ?
- 使用 Linq 与自定义 IEqualityComparer 相交
- 忽略不区分大小写的字典键中的连字符
- C#:拆分字符串而不返回空字符串
- IEnumerable.Any(Func) 何时返回值?
- IEnumerable.比带中断的 for 循环快吗?
我想最有效的LINQ方式意味着这里最易读。
显而易见的方法是在调用Split()
时使用StringSplitOptions.RemoveEmptyEntries
,而不是首先存储空格。
authorizedRolesList = AuthorizedRolesValues.Split(new []{','}, StringSplitOptions.RemoveEmptyEntries);
但是,如果由于某种原因您想保留额外的空格或无法更改authorizedRolesList
中的条目,您可以轻松地将if
子句从
if (authorizedRolesList.Contains(userRoleName))
自
if (authorizedRolesList.Any(x => x.Trim() == userRoleName))
顺便说一句,谈到 LINQ:
你可以用
bool isAuthorizedRole = userRoles.Any(ur => authorizedRolesList.Any(ar => ar.Trim() == ur.Trim()))
如果确保未null
userRoles
和authorizedRolesList
(请改用空集合)。
恕我直言,更具可读性的东西是这样的
bool isAuthorizedRole = userRoles.Intersect(authorizedRolesList, new IgnoreWhitespaceStringComparer()).Any();
IgnoreWhitespaceStringComparer
看起来像什么样
class IgnoreWhitespaceStringComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
return x.Trim().Equals(y.Trim());
}
public int GetHashCode(string obj)
{
return obj.Trim().GetHashCode();
}
}
只需像这样修剪列表中的每个条目:
authorizedRolesList.ForEach(a => a = a.Trim());
尝试这样删除拆分字符串时使用空格并使用 Trim()
List<string> authorizedRolesList = null;
string AuthorizedRolesValues = "A, B ,C,D";
if (!String.IsNullOrEmpty(AuthorizedRolesValues))
{
string[] separators = {","};
authorizedRolesList = new List<string>(
((AuthorizedRolesValues)
.Split(separators , StringSplitOptions.RemoveEmptyEntries))
.Select(x => x.Trim());
}
在此之后,请在下面的代码中使用这样的 Trim()
//Contains Check
if (authorizedRolesList.Contains(userRoleName.Trim()))
{
isAuthorizedRole = true;
}
string authorizedRolesValues = "A, B ,C,D";
var authorizedRolesList = authorizedRolesValues
.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries)
.Select(role => role.Trim());
var userRoles = new Collection<string> {"B "};
bool isAuthorizedRole = userRoles
.Select(roleName => roleName.Trim())
.Any(authorizedRolesList.Contains);
也修剪原始列表怎么样?
authorizedRolesList = new List<string>((AuthorizedRolesValues).Split(',').Select(x => x.Trim()));
试试这个
bool ifExists = userRoles.Any(AuthorizedRolesValues.Split(',').Select(val => val = val.trim());