Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 林克交叉_C#_Linq_Foreach_Intersect - Fatal编程技术网

C# 林克交叉

C# 林克交叉,c#,linq,foreach,intersect,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<Q

大多数时候我只使用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 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 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();

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

你有没有试过把它转换成linq?我用过resharper,就像Malter提到的那样。但我不喜欢结果。我觉得读起来不太好。正如你看到的,看看所有这些答案:最好的答案不是由resharper生成的。我完全同意:作为一个问题,这是一个有价值的问题——我唯一的观点是,请在摆姿势时展示你的尝试。我们可以从这里帮助您:开始写一篇评论,说明您可以如何在这方面稍作改进-但意识到可以用更简单的方式编写-检查我的答案。您将返回User.Roles列表。它应该是列表-@Tony_Mikegolf是的,今天代码太多-现在修复。希望你仍然可读。你应该得到最好答案的学分!唉,我的名声还不到15岁。有人对我的问题给出了-1,所以我现在更低了。你应该仍然能够接受这个答案。只是说…:P
            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();