2013-04-16 4 views
3

중첩 된 "foreach"의 수에 대한 모범 사례가 있습니까?모범 사례 : 중첩 된 ForEach

그게 복잡한 사전에 중첩 된 "foreach"로 나선형입니다. 성능을 저해 할 수있는 오버 헤드를 생성하기 시작한 지점이 있습니까? 고려해야 할 가치가있는 것입니까?

구체적이고 주관적으로 열리지 않게하려면 3 개의 복잡한 사전이 있습니다. 나는 (foreach 문에서)이 사전 필터링 바깥 1.에서 제외 내가 찾고 데이터, 내 코드의 구조는 5 중첩 "foreach는"쪽으로 향하고을 생산하기 위해 지금처럼 분명히

Dictionary<int, Dictionary<string, XObject>() 
Dictionary<string, List<YObject>() 
Dictionary<string, Dictionary<string, List<ZObjects>() 

, 대답이 내가 영향을받을 수있는 걱정 분야입니다

  1. 성능 (너무 많은 컨텍스트 스위치)는
  2. (주어진 순간에 메모리에 모든 데이터 집합을 유지) 메모리
  3. 유지 보수성 (나쁜 프로그래머!)

연습 최상 또는 중요하지 않습니다?

+3

이런 종류의 구조에서는 데이터를 캡슐화하고 설명하는 맞춤 클래스를 만드는 것이 좋습니다. – Oded

+0

@Oded 나는 문제가 여전히 같을 것이라고 생각한다. 더 읽기 쉬울 것입니다. – WiiMaxx

답변

4
  1. foreach 문에 대한 "컨텍스트 전환"이 없습니다.
  2. 메모리 : 항목
3

을 달성하기 위해 분명하고 간결한 방법을 수행하는 방법을 추가하는 코드를 리팩토링 고려 : 매우 관련이없는가, 메모리가 없습니다 열거 자에 의해 데이터에 의해 촬영

  • Maintanability은 (foreach는 문에서 사용) 이것은 기능적으로 그들을 분리하는 것입니다. 다음을 고려하십시오.

    // represents outer loop 
    IEnumerable<KeyValuePair<string, string>> Operation1(IEnumerable<KeyValuePair<string, string>> input) 
    { 
        // outer loop processing 
        IEnumerable<KeyValuePair<string, string>> output = Operation2(input); 
        return output; 
    } 
    
    // which feeds in to... 
    
    IEnumerable<KeyValuePair<string, string>> Operation2(IEnumerable<KeyValuePair<string, string>> input) 
    { 
        // work on it 
        IEnumerable<KeyValuePair<string, string>> output = Operation3(input); 
        return output; 
    } 
    
    // and finally 
    
    IEnumerable<KeyValuePair<string, string>> Operation3(IEnumerable<KeyValuePair<string, string>> input) 
    { 
        // work on it 
        return input; 
    } 
    

    이렇게하면 루프의 기능을 분리하여 유지할 수 있으며 순서를 변경할 수 있으며 각 작업은 신중한 작업 단위입니다.