2010-12-03 60 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執行一些操作。然而,在這種情況下,這個邏輯不會將處理限制在最多一個子實體?或者它會以某種方式忽略沒有字段的子實體的處理?For循環中布爾邏輯的用途

背景:很顯然,這段代碼很長一段時間都處於雷達下,但現在有人注意到它可能無法正確執行。我沒有執行此代碼/調試的數據。

+0

謝謝大家對你的答案! – 2010-12-03 15:02:50

回答

7

不,它將處理限制爲在第一個子實體而不是字段之前的所有子實體。

在LINQ而言,它等同於:

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

我會非常懷疑它。我懷疑這是意味着是等價的:

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

...這將通過把條件體內循環來實現,例如

for (int i = 0; i < OurObject.Entities.SubEntities.Count; i++) 
{ 
    if (OurObject.Entities.SubEntities[i].Fields == null) 
    { 
     continue; 
    } 
    // Do something with OurObject.Entities.SubEntities[i].Fields.SomeFieldName1 
    // Do something with OurObject.Entities.SubEntities[i].Fields.SomeFieldName2 
    // etc.  
} 
+1

感謝您爲表達此邏輯提供Linq和非Linq替代方案。 – 2010-12-03 15:01:40

0

使用for循環的本質,是的,這可能會停止在第一個SubEntity沒有的字段附加。即使他們試圖抓住的任何SubEntitiesFields第一,這當然不是去解決它的方式。

0

邏輯停止在第一個不滿足條件的實體,即第一個Field == null,否則在SubEntities集合中的最後一個實體。

1

這並不是說處理會在一個子實體後停止,但當它遇到沒有任何字段的子實體時它將停止。

0

它迭代SubEntities,直到它到達結尾,或者打到沒有字段的一個。第一個沒有字段後面的所有子實體都將被忽略,即使它們本身具有字段。

有時候你想要這種行爲,但在這種情況下,它看起來像是一個bug,編碼器不想破壞,而是繼續代替,這將處理所有帶有字段的SubEntities。

但我會重構此代碼使用Linq,即TakeWhileWhere,因爲這使得清晰。

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 
    ... 
}