C#Linq相交

时间:2016-10-11 14:03:52

标签: 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<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;
}

6 个答案:

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

但我不认为它的可读性更好; - )