Pregunta

Tengo una Función que devuelve un Collection<string>, y que se llama a sí mismo de forma recursiva para, finalmente, regresar a un grande Collection<string>.

Ahora, me pregunto cuál es el mejor enfoque para combinar las listas? Collection.CopyTo() sólo copias a string[], y el uso de un foreach() bucle se siente como ser ineficientes.Sin embargo, ya que también quiero filtrar los duplicados, siento que voy a terminar con un foreach que llama Contains() en el Collection.

Me pregunto, ¿hay una manera más eficiente para tener una función recursiva que devuelva una lista de cadenas sin duplicados?No tengo que usar un Collection, puede ser bonito mucho cualquier tipo de datos.

Sólo la exclusión, estoy obligado a Visual Studio 2005 y .net 3.0, por lo que no LINQ.

Editar: Para aclarar:La Función toma un usuario de Active Directory, se ve en los Informes Directos del usuario y, a continuación, de forma recursiva se ve en los informes directos de cada usuario.Por lo que el resultado final es una Lista de todos los usuarios que están en la "cadena de mando" de un usuario determinado.Ya que este se ejecuta con bastante frecuencia y en el momento en que tarda 20 Segundos para algunos usuarios, yo estoy buscando maneras de mejorar.El almacenamiento en caché el resultado por 24 Horas también está en mi lista, por cierto., pero quiero ver cómo mejorarlo antes de la aplicación de almacenamiento en caché.

¿Fue útil?

Solución

Si usted está utilizando la Lista<> usted puede utilizar .AddRange para agregar una lista a otra lista.

O puede utilizar el rendimiento de volver a combinar las listas, sobre la marcha, como este:

public IEnumerable<string> Combine(IEnumerable<string> col1, IEnumerable<string> col2)
{
    foreach(string item in col1)
        yield return item;

    foreach(string item in col2)
        yield return item;
}

Otros consejos

Es posible que desee echar un vistazo a Iesi.Colecciones y Extendido Genérico Iesi.Colecciones (debido a que la primera edición se hizo en 1.1 cuando no había genéricos aún).

Extendido Iesi tiene un ISet clase que actúa exactamente como un HashSet:se impone la única miembros y no se permiten duplicados.

El ingenioso cosa acerca de Iesi, es que se ha operadores de conjunto en lugar de los métodos para la fusión de las colecciones, así que usted tiene la posibilidad de elegir entre una unión (|), intersección (&), XOR ( ^ ), y así sucesivamente.

Creo HashSet<T> es una gran ayuda.

El HashSet<T> la clase proporciona set de alto rendimiento de las operaciones.Un conjunto es una colección que contiene no elementos duplicados, y cuyos elementos están en ningún orden en particular.

Sólo añadir elementos y, a continuación, utilizar el método CopyTo.


Actualización: HashSet<T> es en .Net 3.5

Tal vez usted puede utilizar Dictionary<TKey, TValue>.Configuración de una clave duplicada en un diccionario, no elevará una excepción.

Se puede pasar de la Colección en la que el método por referencia, de modo que usted puede agregar elementos a la misma, de esa manera usted no tiene que devolver nada.Esto es lo que podría parecer como si usted lo hizo en c#.

class Program
{
    static void Main(string[] args)
    {
        Collection<string> myitems = new Collection<string>();
        myMthod(ref myitems);
        Console.WriteLine(myitems.Count.ToString());
        Console.ReadLine();
    }

    static void myMthod(ref Collection<string> myitems)
    {
        myitems.Add("string");
        if(myitems.Count <5)
            myMthod(ref myitems);
    }
}

Como Dijo @Zooba Pasando por el ref no es necesario en este caso, si se pasa por valor también funcionará.

Tan lejos como la fusión va:

Me pregunto, ¿hay una manera más eficiente manera de tener una función recursiva que devuelve una lista de cadenas sin los duplicados?No tengo que usar un La colección, puede ser bonito mucho cualquier apto tipo de datos.

Su función ensambla un valor de retorno, a la derecha?Va a dividir la lista suministrada por la mitad, invocando el auto nuevo (dos veces) y, a continuación, combinar los resultados.

Durante el paso combinación, ¿por qué no acaba de comprobar antes de agregar cada cadena en el resultado?Si es que ya existe, vaya.

Suponiendo que usted está trabajando con listas ordenadas de curso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top