For循环中布尔逻辑的目的

时间:2010-12-03 14:44:51

标签: c#

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?或者它会以某种方式跳过没有字段的SubEntities的处理?

背景:显然这段代码已经在雷达下飞行了很长时间,但现在有人注意到它可能无法正常运行。我没有执行此代码/调试的数据。

5 个答案:

答案 0 :(得分: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 :(得分:1)

并不是处理会在一个子实体之后停止,但它会在遇到没有任何字段的子实体时停止。

答案 2 :(得分:0)

使用for循环的性质,是的,这可能会停留在第一个没有和附加字段的SubEntity上。即使他们试图使用SubEntities第一个来抓取任何 Fields,这肯定不是解决问题的方法。

答案 3 :(得分:0)

逻辑在第一个不满足条件的实体处停止,即第一个Field == null,或者在SubEntities集合中的最后一个实体。

答案 4 :(得分:0)

迭代SubEntities,直到它到达结尾,或者击中没有字段的子实体。在第一个没有字段之后的所有子实体将被忽略,即使它们本身也有字段。

有时候你想要这种行为,但在这种情况下,它看起来像是一个bug,编码器不想破坏,而是继续,这将处理所有带字段的SubEntity。

但是我会重构这段代码以使用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
  ...
}