我对C#没有太多经验,所以如果有人能指出我正确的方向,我会非常感激。我有一个foreach循环引用一个对象的变量。我希望在主要的一个中创建另一个foreach循环,它将当前变量与对象数组中其余变量进行比较(或执行操作)。 我有以下代码:
// Integrate forces for each body.
foreach (RigidBodyBase body in doc.Bodies)
{
// Don't move background-anchored bodies.
if (body.anchored) continue;
// This is where we will add Each Body's gravitational force
// to the total force exerted on the object.
// For each other body, get it's point and it's mass.
// Find the gravitational force exterted between target body and looped body.
// Find distance between bodies.
// vector addition
// Force = G*mass1*mass2/distance^2
// Find vector of that force.
// Add Force to TotalGravityForce
// loop until there are no more bodies.
// Add TotalGravityForce to body.totalForce
}
答案 0 :(得分:15)
每次执行foreach时,(即使在嵌套它们时),内部枚举器应该为你“新”一个新的迭代器,应该没有任何问题。当您在迭代时添加或删除集合中的项目时会出现问题......
请记住,在内部的foreach中,要检查以确保您不在与每个外部相同的项目上
foreach( RigidBodyBase body in doc.Bodies)
foreach ( RigidBodyBase otherBody in doc.Bodies)
if (!otherBody.Anchored && otherBody != body) // or otherBody.Id != body.Id -- whatever is required...
// then do the work here
顺便说一句,放置此代码的最佳位置是RigidBodyBase类的GravityForce属性,然后你可以写:
foreach (RigidBodyBase body in doc.Bodies)
body.TotalForce += body.GravityForce;
虽然取决于你在这里所做的事情(移动所有物体?),但他们可能更有机会进行重构......我还考虑为“其他”力量提供单独的属性,并拥有TotalForce物业做重力和“其他”力量的总和?
答案 1 :(得分:2)
int l = doc.Bodies.Count;
for ( int i = 0; i < l; i++ )
for ( int j = i + 1; j < l; j++ )
// Do stuff
答案 2 :(得分:1)
只要你不改变内部循环中的doc.Bodies,我就没有看到这个问题,因为这会导致事情爆发。但理论上这可行。至于优化,我不确定它是否最好,但它是可能的。
答案 3 :(得分:1)
嗯,这是一个O(n ^ 2)算法,但我猜你在这里别无选择。如何将更多逻辑封装到另一个方法中。这使得事情变得更加容易阅读。
foreach (RigidBodyBase body in doc.Bodies)
{
Integrateforces(ref body, Bodies);
}
...
public void Integrateforces(RigidBodyBase out body, RigidBodyBase[] Bodies)
{
//Put your integration logic here
}
答案 4 :(得分:-3)
在这种情况下,最好使用带有索引的常规for循环来表示你所在的元素。尝试使用它自己的foreach循环迭代同一个集合会导致问题。