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を使用し、いつLINQで.FirstOrDefaultを使用するのですか?
  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(代わりに空のコレクションを使用してください)。

さらに読みやすいIMHOは次のようになります

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
        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 に答える
1

次のように、リスト内のすべてのエントリをトリミングするだけです。

authorizedRolesList.ForEach(a => a = a.Trim());
于 2012-12-06T12:35:13.453 に答える
0

これを試して

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

元のリストもトリミングしてみませんか?

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

于 2012-12-06T12:35:03.700 に答える