2010-12-03 5 views
1
for (int i = 0; i < OurObject.Entities.SubEntities.Count && OurObject.Entities.SubEntities[i].Fields != null; i++) 
{ 
    // Do something with OurObject.Entities.SubEntities[i].Fields.SomeFieldName1 
    // Do something with OurObject.Entities.SubEntities[i].Fields.SomeFieldName2 
    // etc.  
} 

나는이 논리의 의도를 오래 전부터 수집하려고합니다. 이 응용 프로그램의 다른 곳에서는 컬렉션의 모든 SubEntity에 대해 일부 작업이 수행됩니다. 그러나이 경우 로직이 최대 하나의 SubEntity로 처리를 제한하지 않습니까? 또는 Field가없는 SubEntities에 대한 처리를 어떻게 되풀이합니까?For 루프의 부울 논리의 목적

배경 : 분명히이 코드는 오랫동안 레이더 아래로 날아 갔지만, 이제는 누군가 올바르게 작동하지 않을 수도 있다는 것을 알게되었습니다. 이 코드/디버깅을 수행하기위한 데이터가 없습니다.

+0

귀하의 답변에 대한 여러분 모두 감사에 해당합니다! –

답변

7

아니요, 첫 번째 하위 요소 인 앞에있는 필드가있는 모든 하위 요소에 처리를 제한합니다 ( 필드 없음).

foreach (var subEntity in OutObject.Entities.SubEntities 
              .TakeWhile(x => x.Fields != null)) 

나는 그것을 매우 의심스러운 것 : LINQ의 관점에서

, 그것은 동등합니다.

foreach (var subEntity in OutObject.Entities.SubEntities 
              .Where(x => x.Fields != null)) 

... 루프의 몸 내부의 상태를 넣어 달성 할 것, 예를 들면 : 나는 가 동등한 것으로을 의미 용의자

+1

이 논리를 표현하기 위해 Linq 및 Linq 이외의 대안을 제안 해 주셔서 감사합니다. –

0

for 루프의 특성을 사용하면 가능합니다. 잠재적으로 this는 가지고 있지 않은 첫 번째 SubEntity에서 중단되고 필드가 첨부됩니다. SubEntitiesFields 또는 첫 번째으로 잡으려고 시도하는 경우에도이 방법은 확실하지 않습니다.

0

논리는 조건을 충족시키지 않는 첫 번째 엔터티, 즉 Field == null 인 첫 번째 엔터티 또는 다른 경우에는 SubEntities 컬렉션의 마지막 엔터티에서 중지됩니다.

1

하나의 하위 항목 이후에 처리가 중지되지 않지만 필드가없는 하위 항목을 발견하면 중지됩니다.

0

끝까지 도달하거나 필드없이 하나가 될 때까지 SubEntities를 반복합니다. 필드가없는 첫 번째 요소 다음에 오는 모든 하위 요소는 필드 자체가 있어도 무시됩니다.

때때로이 동작을 원하지만이 경우 버그처럼 보입니다. 그리고 코더는 중단하고 싶지 않고 대신 계속 진행하여 필드가있는 모든 하위 항목을 처리합니다.

하지만 Linq를 사용하기 위해이 코드를 리펙토링합니다. 즉, TakeWhile 또는 Where 중 하나입니다.

for (int i = 0; i < OurObject.Entities.SubEntities.Count && OurObject.Entities.SubEntities[i].Fields != null; i++) 
{ 
    ... 
} 

for (int i = 0; i < OurObject.Entities.SubEntities.Count; i++) 
{ 
    if(OurObject.Entities.SubEntities[i].Fields == null) 
    break;//Perhaps he intended `continue` and not break here 
    ... 
}