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的处理?
背景:显然这段代码已经在雷达下飞行了很长时间,但现在有人注意到它可能无法正常运行。我没有执行此代码/调试的数据。
答案 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,即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
...
}