2016-10-11 4 views
-2

В большинстве случаев я просто использую операторы foreach, потому что это намного проще для меня кодировать. Позже, когда мой код будет выполнен, я конвертирую foreach в операторы LINQ, где это имеет смысл.C# Linq Intersect

Я хочу научиться писать хорошие читаемые заявления 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; 
} 
+2

Вы первым попытался преобразовать это в какой-то LINQ? –

+1

Я использовал resharper, точно так же, как упоминал Malte R. Но мне не нравится результат. Я не думаю, что это приятно читать. –

+1

Как вы можете видеть, глядя на все эти ответы: лучший ответ не был вызван resharper. Для написания достойных операторов LINQ, которые можно прочитать, требуются большие навыки. –

ответ

1

Это может быть упрощена:

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

Вы возвращаете список User.Roles. Это должен быть список ;-) –

+0

@Tony_KiloPapaMikeGolf да, слишком много кода сегодня - исправлено. Надеюсь, мы с нетерпением будем читать. – decPL

+0

Вы заслуживаете кредитов за лучший ответ! Увы, моя репутация меньше 15. И кто-то дал -1 для моего вопроса, так что я уже ниже. –

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

Вы можете сделать это:

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

использованием ReSharp эр:

  return (from role in user.Roles 
       from QARoles qarole 
       in System.Enum.GetValues(typeof(QARoles)) 
       where role.Name.Equals(qarole.ToString()) 
       select qarole) 
       .ToList(); 
0
return System.Enum.GetValues(typeof(QARoles)).Where(role => 
user.Roles.Any(r => r.Name == role.ToString())) 
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(); 

Но я не думаю, что он стал лучше читаемым ;-)

+0

Начинал писать комментарий о том, как вы могли немного улучшить это, но понял, что его можно написать гораздо проще - проверьте мой ответ. – decPL

Смежные вопросы