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;
}

C#林克相交

这可以简化为:

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

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