2008-12-01 13 views
10

में मुझे सी # के साथ बहुत अधिक अनुभव नहीं है, इसलिए यदि कोई मुझे सही दिशा में इंगित कर सकता है तो मैं इसकी सराहना करता हूं। मेरे पास एक फ़ोरैच लूप है जो किसी ऑब्जेक्ट के चर का संदर्भ देता है। मैं मुख्य चर के अंदर एक और फ़ोरैच लूप बनाना चाहता हूं जो ऑब्जेक्ट की सरणी में शेष चर के लिए वर्तमान चर की तुलना करता है (या क्रियाएं करता है)। मैं निम्नलिखित कोड है:सी # फोरैच लूप

// 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 

    } 

उत्तर

15

हर बार जब आप 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; 

यद्यपि आप क्या पर निर्भर करता है यहाँ कर रहे हैं (सभी वस्तुओं को ले जा रहे हैं?) वे ई हो सकते हैं रेफैक्टरिंग के लिए और अधिक मौका ... मैं "अन्य" बलों के लिए एक अलग संपत्ति रखने पर भी विचार करता हूं, और कुल फोर्स संपत्ति ग्रेविटी फोर्स और "अन्य" बलों का योग करती है?

+0

मुझे यह जवाब सबसे अच्छा लगता है क्योंकि, मैंने जो पढ़ा है, उससे फोरच लूप लूप के लिए अधिक कुशल है। – wcm

-3

इस मामले में, यह शायद एक सूचकांक के लिए क्या तत्व आप पर हैं के साथ पाश के लिए एक नियमित रूप से उपयोग करने के लिए बेहतर है। अपने स्वयं के फ़ोरैच लूप के साथ उसी संग्रह पर पुनरावृत्ति करने का प्रयास करने से समस्याएं पैदा हो जाएंगी।

+0

मुझे पूरा यकीन है कि आपको दूसरे फोरैच लूप के साथ एक नया गणक मिलता है, इसलिए आपको किसी भी समस्या में भाग नहीं लेना चाहिए। –

+0

हां यह सही है, कम से कम किसी भी उचित लिखित संग्रह वर्ग के लिए ... यह हमेशा संभव है कि कुछ डेवलपर एक कस्टम फ्रेमवर्क संग्रह कक्षा लिखने से गलत तरीके से कार्यान्वित हो जाएंगे, लेकिन एमएस, या अन्य सम्मानित स्रोत से कुछ भी के लिए, यह कोई मुद्दा नहीं है । –

+0

हाँ, क्षमा करें, मुझे नहीं पता कि मेरा सिर आज कहाँ है। यद्यपि चार्ल्स ने उल्लेख किया है, अगर आप संग्रह को बदलने (जोड़ने या हटाने) को बदलने की कोशिश करते हैं तो आप त्रुटियां प्राप्त करते हैं क्योंकि आप इसे फिर से चालू कर रहे हैं। – Kibbee

2

आईएमएचओ यह संभव होना चाहिए, हालांकि आपको वास्तव में किबी के सुझाव पर विचार करना चाहिए। (उदाहरण के लिए, इस :)

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

जब तक आप दस्तावेज़ नहीं बदलते हैं, तब तक मुझे कोई समस्या नहीं दिखाई देती है। आंतरिक लूप के अंदर शरीर, क्योंकि इससे चीजें उड़ने लगती हैं। लेकिन सिद्धांत में यह काम करेगा। अनुकूलन के लिए मुझे यकीन नहीं है कि यह सबसे अच्छा है, लेकिन यह संभव है।

1

ठीक है, यह एक ओ (एन^2) एल्गोरिदम है, लेकिन मुझे लगता है कि आपके पास कोई विकल्प नहीं है। अपने तर्क के अधिक तरीके को किसी अन्य विधि में encapsulating के बारे में कैसे। इससे चीज पुरानी और अधिक पठनीय होती है।

foreach (RigidBodyBase body in doc.Bodies)   
{     
    Integrateforces(ref body, Bodies); 
} 

... 

public void Integrateforces(RigidBodyBase out body, RigidBodyBase[] Bodies) 
{ 
    //Put your integration logic here 
} 
संबंधित मुद्दे