大多数时候我只使用foreach
语句,因为这对我来说更容易编码。
稍后,当我的代码完成后,我将foreach
转换为有意义的LINQ语句。
我想学习如何编写良好的可读LINQ语句。
你们如何将这个foreach
代码转换为正确的LINQ语句?
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;
}
答案 0 :(得分:1)
你可以这样做:
var roles=System.Enum.GetValues(typeof(QARoles));
return roles.Where(r=>user.Roles.Any(role=>role.Name.Equals(r.ToString())).ToList();
答案 1 :(得分:1)
这可以简化为:
var result = user.Roles
.Where(r => Enum.IsDefined(typeof(QARoles), r.Name))
.Select(r => (QARoles)Enum.Parse(typeof(QARoles), r.Name))
.ToList();
答案 2 :(得分:0)
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.SelectMany(role => System.Enum.GetValues(typeof(QARoles)).Cast<QARoles>(),
(role, qarole) => new {role, qarole})
.Where(t => t.role.Name.Equals(t.qarole.ToString())).Select(t => t.qarole).ToList();
答案 3 :(得分:0)
使用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();
答案 4 :(得分:0)
return System.Enum.GetValues(typeof(QARoles)).Where(role =>
user.Roles.Any(r => r.Name == role.ToString()))
答案 5 :(得分:0)
我自己想出了这个:
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();
但我不认为它的可读性更好; - )