linq查询中的切换大小写

switch case inside linq query

如何在可能的空处理的相应 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";
                    }
                }
            }
        }

你可以使用这个:

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

我在这里没有使用 switch,因为您需要使用 ToLower 进行不区分大小写的比较。那你不通过 turkey test 。因此,我将 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();

从 C# 8.0 开始,以下内容应该可以工作:

string result = userData.ManagedUsers.Values
.Where(u => u.UserId == userId)
.SelectMany(u => u.Roles)
.Select(r => 
    r.ToLower() switch
    {
       "underwriter1" => "1",
       "underwriter2" => "2",
       "underwriter3" => "3"
    }).First(r => r != null);