1

我有以下代码检查 userRoles 集合是否具有authorizedRolesList 中的任何值。如果 userRoleName 有空格,则它不起作用。

处理此问题的最有效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;
                    }
                }

            }
        }

参考:

  1. 何时使用 .First 以及何时将 .FirstOrDefault 与 LINQ 一起使用?
  2. 使用 Linq 与自定义 IEqualityComparer 相交
  3. 忽略不区分大小写的字典键中的连字符
  4. C#:拆分字符串而不返回空字符串
  5. IEnumerable.Any(Func) 什么时候返回值?
  6. IEnumerable.Any 是否比带中断的 for 循环快?
4

6 回答 6

4

我想最有效的 LINQ 方式 在这里意味着最易读。

显而易见的方法是StringSplitOptions.RemoveEmptyEntries在调用时使用Split()而不是首先存储空格。

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

如果您确保userRoles并且authorizedRolesList不是null(使用空集合代替)。

恕我直言,更具可读性的是

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();
    }
}
于 2012-12-06T12:39:41.130 回答
1

尝试像这样在拆分字符串时删除空格并使用 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;
                }
于 2012-12-06T12:34:35.350 回答
1

只需像这样修剪列表中的每个条目:

authorizedRolesList.ForEach(a => a = a.Trim());
于 2012-12-06T12:35:13.453 回答
1
        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);
于 2012-12-06T12:51:59.387 回答
0

如何修剪原始列表呢?

authorizedRolesList = new List<string>((AuthorizedRolesValues).Split(',').Select(x => x.Trim()));

于 2012-12-06T12:35:03.700 回答
0

试试这个

bool ifExists = userRoles.Any(AuthorizedRolesValues.Split(',').Select(val => val = val.trim());
于 2012-12-06T12:40:05.193 回答