C# Linq 相交
C# Linq Intersect
大多数时候我只使用 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;
}
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();
你可以这样做:
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 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();
但我认为它的可读性并没有提高 ;-)
大多数时候我只使用 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;
}
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();
你可以这样做:
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 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();
但我认为它的可读性并没有提高 ;-)