C# 林克交叉
大多数时候我只使用foreach语句,因为这对我来说编码要容易得多。 稍后,当我的代码完成时,我将foreach转换为LINQ语句,这是有意义的 我想学习如何编写可读性好的LINQ语句。 你们如何将这个foreach代码转换成正确的LINQ语句C# 林克交叉,c#,linq,foreach,intersect,C#,Linq,Foreach,Intersect,大多数时候我只使用foreach语句,因为这对我来说编码要容易得多。 稍后,当我的代码完成时,我将foreach转换为LINQ语句,这是有意义的 我想学习如何编写可读性好的LINQ语句。 你们如何将这个foreach代码转换成正确的LINQ语句 private List<QARoles> GetUserRoles(User user) { //TODO: Fix this with LINQ intersect. var result = new List<Q
private List<QARoles> GetUserRoles(User user)
{
//TODO: Fix this with LINQ intersect.
var result = new List<QARoles>();
foreach (var role in user.Roles)
{
foreach (QARoles qarole in System.Enum.GetValues(typeof(QARoles)))
{
if (role.Name.Equals(qarole.ToString()))
{
result.Add(qarole);
}
}
}
return result;
}
或
您可以这样做:
var roles=System.Enum.GetValues(typeof(QARoles));
return roles.Where(r=>user.Roles.Any(role=>role.Name.Equals(r.ToString())).ToList();
这可以简化为:
var result = user.Roles
.Where(r => Enum.IsDefined(typeof(QARoles), r.Name))
.Select(r => (QARoles)Enum.Parse(typeof(QARoles), r.Name))
.ToList();
使用ReSharper:
return (from role in user.Roles
from QARoles qarole
in System.Enum.GetValues(typeof(QARoles))
where role.Name.Equals(qarole.ToString())
select qarole)
.ToList();
我自己想出来的:
return user.Roles
.Select(r => r.Name).ToList<string>()
.Select(str =>
{
QARoles qarole;
bool success = System.Enum.TryParse(str, out qarole);
return new { qarole, success };
})
.Where(pair => pair.success)
.Select(pair => pair.qarole)
.ToList();
但我认为它的可读性没有提高- 你有没有试过把它转换成linq?我用过resharper,就像Malter提到的那样。但我不喜欢结果。我觉得读起来不太好。正如你看到的,看看所有这些答案:最好的答案不是由resharper生成的。我完全同意:作为一个问题,这是一个有价值的问题——我唯一的观点是,请在摆姿势时展示你的尝试。我们可以从这里帮助您:开始写一篇评论,说明您可以如何在这方面稍作改进-但意识到可以用更简单的方式编写-检查我的答案。您将返回User.Roles列表。它应该是列表-@Tony_Mikegolf是的,今天代码太多-现在修复。希望你仍然可读。你应该得到最好答案的学分!唉,我的名声还不到15岁。有人对我的问题给出了-1,所以我现在更低了。你应该仍然能够接受这个答案。只是说…:P
return (from role in user.Roles
from QARoles qarole
in System.Enum.GetValues(typeof(QARoles))
where role.Name.Equals(qarole.ToString())
select qarole)
.ToList();
return System.Enum.GetValues(typeof(QARoles)).Where(role =>
user.Roles.Any(r => r.Name == role.ToString()))
return user.Roles
.Select(r => r.Name).ToList<string>()
.Select(str =>
{
QARoles qarole;
bool success = System.Enum.TryParse(str, out qarole);
return new { qarole, success };
})
.Where(pair => pair.success)
.Select(pair => pair.qarole)
.ToList();