3 votos

No se puede iterar la función en la iteración anidada while

Necesito hacer alguna operación con todas las combinaciones de características en dos FeatureClasses. El operador de iteración "for" es muy, muy lento, así que decidí probar con el operador "while" y usar FeatureCursor. Así que la iteración anidada que tengo como abajo:

    IFeatureCursor fcur1 = fc1.Search(null, false);
    IFeatureCursor fcur2 = fc2.Search(null, false);

    IFeature f1 = fcur1.NextFeature();
    IFeature f2 = fcur2.NextFeature();

        while (f1 != null)
        {
            //external cycle code
            MessageBox.Show("external cycle FID " + f1.Value[0].ToString());

            while (f2 != null)
            {
                //internal cycle code
                MessageBox.Show("internal cycle FID " + f1.Value[0].ToString());
                f2 = fcur2.NextFeature();
            }
            f1 = fcur1.NextFeature();
        }

Por ejemplo, hay 3 características en cada FeatureClass fc1 y fc2.

enter image description here

Utilizo un MessageBoxes para mostrar el FID de la característica f1 para entender lo que ocurre en las iteraciones externas e internas.

El orden esperado de los MessageBoxes es:

external cycle FID 0
 internal cycle FID 0
 internal cycle FID 0
 internal cycle FID 0
external cycle FID 1
 internal cycle FID 1
 internal cycle FID 1
 internal cycle FID 1
external cycle FID 2
 internal cycle FID 2
 internal cycle FID 2
 internal cycle FID 2

Pero el resultado de mi código es:

external cycle FID 0
 internal cycle FID 0
 internal cycle FID 0
 internal cycle FID 0
external cycle FID 1
external cycle FID 2

Por lo tanto, el ciclo externo opera con todas las características f1, pero el ciclo interno sólo obtiene la primera característica f1. ¿Por qué otra característica f1 no va al ciclo interno?

2voto

David Puntos 2901

Es necesario restablecer el cursor de la característica después de pasar por cada iteración. Ver mis ediciones:

IFeatureCursor fcur1 = fc1.Search(null, false);
IFeatureCursor fcur2;

IFeature f1; 
IFeature f2;

    while ((f1 = fcur1.NextFeature()) != null)
    {
        //external cycle code
        MessageBox.Show("external cycle FID " + f1.Value[0].ToString());

        fcur2 = fc2.Search(null, false);
        while ((f2 = fcur2.NextFeature()) != null)
        {
            //internal cycle code
            MessageBox.Show("internal cycle FID " + f1.Value[0].ToString());
        }
    }

También puede soltar el segundo cursor después de iterar por sus características.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X