whats news new microsoft features docs compute c#

news - C#foreach dentro de un bucle foreach



new features c# (5)

No tengo demasiada experiencia con C #, así que si alguien pudiera señalarme en la dirección correcta, lo agradecería mucho. Tengo un bucle foreach que hace referencia a una variable de un objeto. Deseo hacer otro ciclo foreach dentro del principal que compare (o realice acciones en) la variable actual con el resto de las variables en la matriz del objeto. Tengo el siguiente código:

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


Bueno, este es un algoritmo O (n ^ 2), pero supongo que no tienes otra opción aquí. ¿Qué hay de encapsular más de su lógica en otro método? Esto hace que la cosa simplemente vieja sea más legible.

foreach (RigidBodyBase body in doc.Bodies) { Integrateforces(ref body, Bodies); } ... public void Integrateforces(RigidBodyBase out body, RigidBodyBase[] Bodies) { //Put your integration logic here }


Cada vez que ejecutas foreach (incluso cuando las anides), el Enumerador interno debe "actualizar" un nuevo iterador para ti, no debería haber ningún problema con eso. Los problemas surgen cuando agrega o elimina elementos de la colección mientras todavía está iterando ...

Recuerde, en el foreach interno, verificar para asegurarse de que no está en el mismo artículo que el externo para cada uno.

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

dicho sea de paso, el mejor lugar para poner este código sería en una propiedad GravityForce de la clase RigidBodyBase. Entonces, simplemente podría escribir:

foreach (RigidBodyBase body in doc.Bodies) body.TotalForce += body.GravityForce;

aunque dependiendo de lo que esté haciendo aquí (¿mover todos los objetos?) puede que haya más oportunidades para refactorizar ... También consideraría tener una propiedad separada para las "otras" fuerzas, y hacer que TotalForce Property haga lo suma de la Fuerza de Gravedad y las "otras" Fuerzas?


En este caso, probablemente sea mejor utilizar un bucle for para un índice con el elemento en el que se encuentra. Tratar de iterar sobre la misma colección dentro de su propio bucle foreach causará problemas.


En mi humilde opinión, debería ser posible, aunque realmente debería considerar la sugerencia de Kibbee. Quizás también puedas optimizarlo de esa manera (por ejemplo, así :)

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


No veo ningún problema con esto, siempre y cuando no modifiques los documentos dentro del ciclo interno, ya que esto haría que las cosas explotaran. Pero en teoría esto funcionaría. En cuanto a la optimización, no estoy seguro de si es mejor, pero es posible.