C#林克相交
本文关键字:林克 | 更新日期: 2023-09-27 18:12:26
大多数时候我只使用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;
}
这可以简化为:
var result = user.Roles
.Where(r => Enum.IsDefined(typeof(QARoles), r.Name))
.Select(r => (QARoles)Enum.Parse(typeof(QARoles), r.Name))
.ToList();
您可以这样做:
var roles=System.Enum.GetValues(typeof(QARoles));
return roles.Where(r=>user.Roles.Any(role=>role.Name.Equals(r.ToString())).ToList();
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();
使用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 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();
但我认为它的可读性没有提高;-(