Pergunta

Eu tenho uma função que retorna um Collection<string>, e isso se chama recursivamente para eventualmente retornar um grande Collection<string>.

Agora, gostaria de saber qual a melhor abordagem para mesclar as listas? Collection.CopyTo() apenas copia para string[], e usando um foreach() loop parece ser ineficiente.No entanto, como também quero filtrar duplicatas, sinto que acabarei com um foreach que chama Contains() no Collection.

Eu me pergunto, existe uma maneira mais eficiente de ter uma função recursiva que retorne uma lista de strings sem duplicatas?Eu não preciso usar um Collection, pode ser praticamente qualquer tipo de dados adequado.

Apenas exclusão, estou vinculado ao Visual Studio 2005 e .net 3.0, portanto não há LINQ.

Editar: Esclarecer:A função tira um usuário do Active Directory, examina os subordinados diretos do usuário e, em seguida, examina recursivamente os subordinados diretos de cada usuário.Portanto, o resultado final é uma lista de todos os usuários que estão na "cadeia de comando" de um determinado usuário. Como isso é executado com bastante frequência e no momento leva 20 segundos para alguns usuários, estou procurando maneiras de melhorá-lo.Armazenar o resultado em cache por 24 horas também está na minha lista, mas quero ver como melhorá-lo antes de aplicar o cache.

Foi útil?

Solução

Se estiver usando List<> você pode usar .AddRange para adicionar uma lista à outra lista.

Ou você pode usar o retorno de rendimento para combinar listas rapidamente como esta:

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

Outras dicas

Você pode querer dar uma olhada Iesi.Collections e Iesi.Collections genérico estendido (porque a primeira edição foi feita em 1.1 quando ainda não existiam genéricos).

Extended Iesi possui uma classe ISet que atua exatamente como um HashSet:ele impõe membros únicos e não permite duplicatas.

O interessante do Iesi é que ele definiu operadores em vez de métodos para mesclar coleções, então você pode escolher entre união (|), interseção (&), XOR (^) e assim por diante.

Eu penso HashSet<T> é uma grande ajuda.

O HashSet<T> classe fornece operações de conjunto de alto desempenho.Um conjunto é uma coleção que não contém elementos duplicados e cujos elementos não estão em nenhuma ordem específica.

Basta adicionar itens a ele e usar CopyTo.


Atualizar: HashSet<T> está em .Net 3.5

Talvez você possa usar Dictionary<TKey, TValue>.Definir uma chave duplicada para um dicionário não gerará uma exceção.

Você pode passar a coleção para o seu método por referência, para que você possa apenas adicionar itens a ela, dessa forma você não precisa retornar nada.Isto é o que pareceria se você fizesse isso em 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);
    }
}

Conforme afirmado por @Zooba Passar por ref não é necessário aqui, se passar por valor também funcionará.

No que diz respeito à fusão:

Eu me pergunto, existe um mais eficiente maneira de ter uma função recursiva que retorna uma lista de cadeias de caracteres sem Duplicatas?Eu não tenho que usar um Coleção, pode ser praticamente qualquer tipo de dados adequado.

Sua função monta um valor de retorno, certo?Você está dividindo a lista fornecida pela metade, invocando self novamente (duas vezes) e depois mesclando esses resultados.

Durante a etapa de mesclagem, por que não verificar antes de adicionar cada string ao resultado?Se já estiver lá, ignore.

Supondo que você esteja trabalhando com listas classificadas, é claro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top