C# linq查询中的开关盒
如何使用可能的空处理在相应linq中转换以下foreach语句:C# linq查询中的开关盒,c#,linq,C#,Linq,如何使用可能的空处理在相应linq中转换以下foreach语句: foreach (var val in userData.ManagedUsers.Values) { if (val.UserId == userId) { foreach (var role in val.Roles) { switch (role.ToLowe
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);
我在这里不使用开关
,因为您需要使用ToLower
来不敏感地比较大小写。那你就不能通过考试了。因此,我将String.Equals
与invariantCultureInogoreCase
一起使用,这也更有效,可以处理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();
你试过这个吗?(有没有人投了赞成票,或者OP接受了?)@Rawling:没有类或样本数据,很难进行测试。用
新字符串[0]
测试“有趣”的步骤并不难@Rawling:你说得对,我已经测试过了。lambda表达式需要返回没有else
的情况下不存在的内容。我已经解决了一个例外。我还添加了另一个更简洁的方法。除此之外,你只检查第一个角色。没有理由否决投票。这是一个合法的问题