2014-11-28 2 views
0

기본적으로 사용자 정의 오브젝트 목록을 전달하는 메소드가 있습니다. 나는 C#을 사용하고있다. 이들 각각에는 다른 사용자 정의 객체의 이름과 다른 목록이 포함되어 있으므로이 하위 객체를 호출하겠습니다. 이들은 각각 이름과 문자열 목록을 가지고 있습니다. 모든 문자열을 반복해야하지만 오류 로깅 목적으로 부모 개체 및 주제의 이름을 추적해야합니다. 중첩 된 foreach보다 더 깨끗하고 좋은 방법이 있습니까?C에서 복수의 중첩 된 foreach를 단순화하는 방법 #

foreach (var obj in listOfObjects) 
{ 
    foreach (var subObj in obj.subObjects) 
    { 
     foreach (var aString in subObj.strings) 
     { 
      if (some condition applies) 
      { 
       //log error that includes obj, subObj, and subSubObj names, and aString. 
      } 
     } 
    } 
} 
+0

'if' 블록에서 사용하고자하는 조건은 무엇입니까? – ekad

+1

LINQ를 사용하여이 작업을 수행 할 수는 있지만 훨씬 명확하게 알 수는 없습니다. – MarcinJuraszek

+3

먼저'subobj.strings'을'subObj.strings '로 대체하여 컴파일합니다. :) 이 구조에는 문제가 없습니다. 그것이하는 일을합니다. 유일한 문제는'if' 내부에서'foreach'를 빠져 나가야한다는 것입니다. 플래그 나 아름다운'goto'가 필요할 것입니다. ;) – Andrew

답변

2

당신은 모든 오류의 경우

var errors = from obj in listOfObjects 
      from subObj in obj.subObjects 
      from aString in subObj.strings 
      where /* your condition */ 
      select new { obj, subObj, aString }; 

을 얻기 위해 LINQ 쿼리를 작성하고보다 만이를 반복 할 수 있습니다

foreach(var errorCase in errors) 
{ 
    // log your error 
} 

또는 얻을 첫 번째 :

var error = errors.FirstOrDefault(); 
귀하의 성향에 따라

ds.

+0

이것이 정확히 내가 생각했던 것 같아요. 나에게 그것은 읽고 다루는 것이 훨씬 쉽습니다. 감사! – dhouse42

+0

이 솔루션은 각 요소에 대해 새 개체를 만들기 때문에 효율성이 떨어질 수 있습니다. – Ripple

0

MarcinJuraszek 응답에 추가 개체에 대한 LINQ 선호하는 경우 ...

var errors = listOfObjects 
    .SelectMany(obj => obj.subObjects 
    .SelectMany(subObj => subObj.strings 
     .Where(r => /* your condition */) 
     .Select(aString => new { obj, subObj, aString }))); 

그러나 당신이 게시 코드 아무 문제가 없습니다. 분명히, 당신의 모습을 한눈에 알기 쉽습니다.

+0

다른 구문을 사용하는 경우를 제외하고는 똑같은 해결책입니다. 내 코드는 컴파일러에 의해 동일한 메소드 호출 세트로 변환되지만 더 명확하고 읽기 쉽습니다. – MarcinJuraszek

관련 문제