在linq查询中切换大小写

nec*_*tar 2 c# linq

如何在可能的null处理下在相应的linq中转换下面的foreach语句:

foreach (var val in userData.ManagedUsers.Values)
        {
            if (val.UserId == userId)
            {
                foreach (var role in val.Roles)
                {
                    switch (role.ToLower())
                    {
                        case "underwriter1":
                            return "1";
                        case "underwriter2":
                            return "2";
                        case "underwriter3":
                            return "3";
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 5

您可以使用此:

string result = userData.ManagedUsers.Values
    .Where(u => u.UserId == userId)
    .SelectMany(u => u.Roles)
    .Select(r => {
        if(String.Equals(r, "underwriter1", StringComparison.InvariantCultureIgnoreCase))
            return "1";
        else if(String.Equals(r, "underwriter2", StringComparison.InvariantCultureIgnoreCase))
            return "2";
        else if(String.Equals(r, "underwriter3", StringComparison.InvariantCultureIgnoreCase))
            return "3";
        else return null; 
    }).First(r => r != null);
Run Code Online (Sandbox Code Playgroud)

我不在switch这里使用a ,因为您需要使用ToLower不区分大小写的比较。那你没有通过火鸡考试。因此我使用String.EqualsInvariantCultureIgnoreCase它也是更高效和手柄的情况下Rolenull

顺便说一句,如果我正确理解您的逻辑,这似乎会更好:

 string result = userData.ManagedUsers.Values
     .Where(u => u.UserId == userId)
     .SelectMany(u => u.Roles)
     .Select(r => r != null && r.StartsWith("underwriter") ? r.Substring("underwriter".Length) : null)
     .First();
Run Code Online (Sandbox Code Playgroud)