2017-05-17 10 views
1

I C#에서 다음과 같은 코드가 있습니다foreach 문을 제거하여 방법의 복잡성을 줄 루프

foreach (var c1 in object1.Collection1) 
{ 
    foreach (var c2 in c1.Collection2.Where(b => b.Settings?.Name != null)) 
    { 
     foreach (var c3 in c2.Settings.Name.Where(s => !string.IsNullOrWhiteSpace(s)).Select(s => s.ToLowerInvariant().GetHashCode()).ToList()) 
     { 
      //process c3 
     } 
    } 
} 

어떻게 배열에 내가 필요로하는 요소를 (c2.Settings.Name) 결합 linq을 사용하고 있기 때문에이 코드를 하나의 foreach이 내 방법의 복잡도는 5이고 Sonar은 이에 대해 불평하고 있습니다.

+2

당신은 확실히 LINQ를 사용할 수 있지만 가능성이 더 이상 무언가와 끝까지하지 않습니다 효율적이며 덜 읽을 수도 있습니다. –

+0

@MattBurland 및이 상황에서 무엇을 선택 하시겠습니까? –

+5

LINQ를 사용하면 성능이나 복잡성을 고려하여 코드를 더 잘 만들 수 있다는 것이 일반적인 오류입니다. 사실 그것은 종종 좋은 점이 아닌 복잡성을 숨 깁니다. Linq는 또한 루프 기반 접근법으로이 작업을 수행하는 것과 정확히 같은 방식으로 컬렉션의 항목을 반복합니다. 코드를 그대로두면, 이해하기 쉽고 일을 끝내게됩니다. 그렇죠? – HimBromBeere

답변

1

사용 SelectMany 확장 방법 :

var query= Collection1.SelectMany(c1=>c1.Collection2 
             .Where(b => b.Settings?.Name != null) 
             .SelectMany(c2=>c2.Settings.Name 
             .Where(s => !string.IsNullOrWhiteSpace(s)) 
             .Select(s => s.ToLowerInvariant().GetHashCode()))); 

또는 사용하여 LINQ 쿼리 표기법 from 여러 :

var query = from c1 in Collection1 
      from c2 in c1.Collection2.Where(b => b.Settings?.Name != null) 
      from c3 in c2.Settings.Name.Where(s => !string.IsNullOrWhiteSpace(s)) 
             .Select(s => s.ToLowerInvariant().GetHashCode()) 
      select c3; 
+1

그리고 selectMany로 코드가 어떻게 표시 될까요? –

+0

여기에 나와 있습니다. 그러나 볼 수 있듯이 쿼리 표기법 – octavioccl

+1

을 사용하는 것보다 읽기 쉽지 않습니다.이 중 하나가 OP의 원래 코드에서 가독성이나 복잡성을 실제로 향상시키는 지 확신 할 수 없지만 질문에 대답합니다. +1 –