Question

J'ai une Fonction qui renvoie un Collection<string>, et qui appelle récursivement à terme, de retour d'un grand Collection<string>.

Maintenant, je me demande simplement quelle est la meilleure approche pour fusionner les listes? Collection.CopyTo() seules les copies string[], et à l'aide d'un foreach() la boucle se sent comme étant inefficace.Cependant, depuis que je tiens également à filtrer les doublons, je sens que je vais finir avec un foreach qui appelle Contains() sur le Collection.

Je me demande, est-il un moyen plus efficace d'avoir une fonction récursive qui renvoie une liste de chaînes de caractères sans les doublons?Je n'ai pas à utiliser un Collection, il peut être à peu près tout type de données.

Seulement l'exclusion, je suis lié à Visual Studio 2005 et .net 3.0, donc pas de LINQ.

Edit: Pour clarifier:La Fonction prend un utilisateur d'Active Directory, examine les Rapports Directs de l'utilisateur, et puis, de manière récursive regarde les rapports directs de chaque utilisateur.De sorte que le résultat final est une Liste de tous les utilisateurs qui sont dans la "chaîne de commandement" d'un utilisateur donné.Depuis cette est exécuté assez souvent et au moment prend 20 Secondes pour certains utilisateurs, je suis à la recherche de moyens de l'améliorer.La mise en cache le résultat obtenu pour 24 Heures est également sur ma liste btw., mais je veux voir comment l'améliorer avant d'appliquer la mise en cache.

Était-ce utile?

La solution

Si vous êtes en utilisant la Liste des<> vous pouvez utiliser .AddRange pour ajouter une liste à une autre liste.

Ou vous pouvez utiliser taux de retour de combiner des listes à la volée, comme ceci:

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

Autres conseils

Vous voudrez peut-être jeter un oeil à Iesi.Collections et Étendue Générique Iesi.Collections (parce que la première édition a été faite en 1.1 lorsqu'il n'existe pas de génériques encore).

Étendue Iesi a l'ISet de classe qui agit exactement comme un HashSet:il applique les membres uniques et ne permet pas de doublons.

La chouette chose à propos de Iesi, c'est qu'il a mis des opérateurs au lieu de méthodes pour la fusion des collections, alors vous avez le choix entre une union (|), intersection (&), XOR (^) et ainsi de suite.

Je pense HashSet<T> est d'une grande aide.

L' HashSet<T> la classe fournit haute performance des opérations.Un ensemble est une collection qui ne contient pas de les éléments en double, et dont les éléments sont dans aucun ordre particulier.

Juste l'ajout d'éléments et d'utiliser ensuite CopyTo.


Mise à jour: HashSet<T> est dans .Net 3.5

Peut-être que vous pouvez utiliser Dictionary<TKey, TValue>.La fixation d'un double de la clé pour un dictionnaire ne déclenche pas d'exception.

Vous pouvez passer la Collection en vous par la méthode de refernce de sorte que vous pouvez simplement l'ajout d'éléments, de cette façon, vous n'avez pas à retourner quoi que ce soit.C'est ce à quoi il pourrait ressembler si vous l'avez fait 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);
    }
}

Comme l'a Indiqué @Zooba en Passant par le ref n'est pas nécessaire ici, si vous le passage par valeur, il fonctionnera également.

Aussi loin que la fusion se passe:

Je me demande, est-il plus efficace moyen d'avoir une fonction récursive qui retourne une liste de chaînes de caractères sans les doublons?Je n'ai pas à utiliser un La Collection, il peut être à peu près tout convient type de données.

Votre fonction assemble une valeur de retour, non?Vous êtes fractionnement de la liste fournie dans la moitié, en invoquant la légitime nouveau (deux fois), puis la fusion de ces résultats.

Au cours de l'étape de fusion et publipostage, pourquoi ne pas vérifier avant d'ajouter chaque chaîne à la suite?Si elle est déjà là, de l'ignorer.

En supposant que vous travaillez avec de trier les listes de cours.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top