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();

但我认为它的可读性并没有提高 ;-)