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.Equals
与 InvariantCultureIgnoreCase
一起使用,这也更有效,并且可以处理 Role
是 null
.
的情况
顺便说一句,如果我正确理解你的逻辑,这似乎会更好:
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);
如何在可能的空处理的相应 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.Equals
与 InvariantCultureIgnoreCase
一起使用,这也更有效,并且可以处理 Role
是 null
.
顺便说一句,如果我正确理解你的逻辑,这似乎会更好:
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);