【问题标题】:C# Linq IntersectC# Linq 相交
【发布时间】:2016-10-11 14:03:52
【问题描述】:

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

【问题讨论】:

  • 您是否首先尝试将其转换为一些 linq?
  • 我用过 resharper,就像 Malte R 提到的一样。但我不喜欢这个结果。我不认为它读起来很好。
  • 如您所见,查看所有这些答案:最好的答案不是由 resharper 生成的。编写体面的可读 LINQ 语句需要高超的技能。
  • 我完全同意 :) 作为一个问题,这是一个有价值的问题 - 我唯一的一点是,请在摆姿势时展示你尝试过的东西。我们可以从那里帮助你:)

标签: c# linq foreach intersect


【解决方案1】:

这可以简化为:

var result = user.Roles
                 .Where(r => Enum.IsDefined(typeof(QARoles), r.Name))
                 .Select(r => (QARoles)Enum.Parse(typeof(QARoles), r.Name))
                 .ToList();

【讨论】:

  • 您返回一个 User.Roles 列表。它应该是 List ;-)
  • @Tony_KiloPapaMikeGolf 是的,今天代码太多 - 现在已修复。希望仍然很容易阅读。
  • 您应该获得最佳答案的荣誉!唉,我的声望还不到15。有人给我的问题-1,所以我现在更低了。
  • 您应该仍然能够接受该答案。只是说...:P
【解决方案2】:

你可以这样做:

var roles=System.Enum.GetValues(typeof(QARoles));
return roles.Where(r=>user.Roles.Any(role=>role.Name.Equals(r.ToString())).ToList();

【讨论】:

    【解决方案3】:
    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();
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:
        return System.Enum.GetValues(typeof(QARoles)).Where(role => 
        user.Roles.Any(r => r.Name == role.ToString()))
        

        【讨论】:

          【解决方案6】:

          我自己想出了这个:

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

          但我认为它的可读性并没有变得更好;-)

          【讨论】:

          • 开始写评论,说明您可以如何稍微改进一下 - 但意识到它可以用更简单的方式编写 - 检查我的答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-24
          • 1970-01-01
          • 2011-10-26
          • 1970-01-01
          • 2018-11-19
          • 2019-04-07
          相关资源
          最近更新 更多