2016-10-11 5 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

먼저 어떤이를 변환하는 것을 시도했다 린크? –

+1

나는 Malte R이 언급 한 것처럼 resharper를 사용했다. 그러나 나는 그 결과를 좋아하지 않는다. 나는 그것을 읽는 것이 좋다고 생각하지 않는다. –

+1

이 모든 답을 보면 알 수 있듯이 최상의 답은 resharper가 생성하지 못했습니다. 읽을 수있는 적절한 LINQ 문을 작성하는 데는 많은 기술이 필요합니다. –

답변

1

이이 단순화 될 수있다 어 :

  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

당신은 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 result = user.Roles 
       .Where(r => Enum.IsDefined(typeof(QARoles), r.Name)) 
       .Select(r => (QARoles)Enum.Parse(typeof(QARoles), r.Name)) 
       .ToList(); 
0

ReSharp를 사용하여 :

var roles=System.Enum.GetValues(typeof(QARoles)); 
return roles.Where(r=>user.Roles.Any(role=>role.Name.Equals(r.ToString())).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