簡體   English   中英

C#foreach在foreach循環中

[英]C# foreach within a foreach loop

我對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

    }

每次執行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 Property執行重力和“其他”力量的總和?

恕我直言應該是可能的,盡管你應該考慮Kibbee的建議。 也許你也可以這樣優化它(例如,像這樣:)

int l = doc.Bodies.Count;
for ( int i = 0; i < l; i++ )
    for ( int j = i + 1; j < l; j++ )
        // Do stuff 

只要你不改變內循環中的doc.Bodies,我就沒有看到這個問題,因為這會導致事情爆發。 但理論上這可行。 至於優化,我不確定它是否最好,但它是可能的。

嗯,這是一個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
}

在這種情況下,最好使用帶有索引的常規for循環來表示你所在的元素。 嘗試使用它自己的foreach循環迭代同一個集合會導致問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM