Ich habe eine Funktion erhalten, die Collection<string>
zurückgibt, und die sich rekursiv aufruft, um schließlich ein großes Collection<string>
zurückzugeben.
Nun, ich frage mich nur, was ist der beste Ansatz, um die Listen zusammenzuführen? Collection.CopyTo()
kopiert nur in string [], und die Verwendung einer foreach()
-Schleife wirkt sich als ineffizient an. Da ich aber auch Duplikate herausfiltern möchte, habe ich das Gefühl, dass ich mit einer Foreach enden werde, die Contains()
auf Collection
aufruft.
Ich frage mich, gibt es eine effizientere Möglichkeit, eine rekursive Funktion zu haben, die eine Liste von Strings ohne Duplikate zurückgibt? Ich muss kein Collection
verwenden, es kann so ziemlich jeder geeignete Datentyp sein.
Nur Ausschluß, ich bin an Visual Studio 2005 und .net 3.0 gebunden, also kein LINQ.
Bearbeiten: Zur Verdeutlichung: Die Funktion nimmt einen Benutzer aus Active Directory heraus, betrachtet die direkten Berichte des Benutzers und betrachtet dann rekursiv die direkten Berichte jedes Benutzers. Das Endergebnis ist also eine Liste aller Benutzer, die sich in der "Befehlskette" eines bestimmten Benutzers befinden. Da dies ziemlich oft ausgeführt wird und im Moment für einige Benutzer 20 Sekunden dauert, suche ich nach Möglichkeiten, es zu verbessern. Caching das Ergebnis für 24 Stunden ist auch auf meiner Liste btw., Aber ich möchte sehen, wie es vor dem Zwischenspeichern zu verbessern.
Vielleicht möchten Sie sich Iesi.Collections und Erweiterte generische Iesi.Collections (weil die erste Ausgabe in 1.1 gemacht wurde, als es noch keine Generika gab).
>Extended Iesi hat eine ISet-Klasse, die genau wie ein HashSet funktioniert: es erzwingt eindeutige Member und erlaubt keine Duplikate.
Das Interessante an Iesi ist, dass es Operatoren anstelle von Methoden zum Zusammenführen von Sammlungen gesetzt hat. Sie haben also die Wahl zwischen einer Vereinigung (|), Schnittmenge (& amp;), XOR (^) und so weiter.
Ich denke HashSet<T>
ist eine große Hilfe.
Die Klasse
HashSet<T>
bietet Hochleistungs-Set-Operationen. Ein Satz ist eine Sammlung, die keine enthält doppelte Elemente und deren Elemente sind in keiner bestimmten Reihenfolge.
Fügen Sie einfach Elemente hinzu und verwenden Sie dann CopyTo.
Aktualisieren : HashSet<T>
ist in .Net 3.5
Vielleicht können Sie Dictionary<TKey, TValue>
verwenden. Das Festlegen eines doppelten Schlüssels für ein Wörterbuch löst keine Ausnahme aus.
Können Sie die Collection in you-Methode durch Verweis übergeben, so dass Sie einfach Elemente hinzufügen können, so dass Sie nichts zurückgeben müssen. So könnte es aussehen, wenn Sie es in c # gemacht hätten.
%Vor%Wie von @Zooba angegeben Es ist hier nicht nötig, durch ref zu gehen. Wenn Sie einen Wert übergeben, funktioniert das auch.
Was das Zusammenführen betrifft:
Ich frage mich, gibt es eine effizientere Möglichkeit, eine rekursive Funktion zu haben gibt eine Liste von Strings ohne zurück Duplikate? Ich brauche kein Sammlung, es kann so ziemlich jeder sein geeigneter Datentyp.
Ihre Funktion setzt einen Rückgabewert zusammen, richtig? Sie teilen die Liste in zwei Hälften auf, rufen self (zweimal) erneut auf und führen dann diese Ergebnisse zusammen.
Warum prüfen Sie nicht einfach beim Zusammenführen, bevor Sie die einzelnen Strings zum Ergebnis hinzufügen? Wenn es schon da ist, überspringen Sie es.
Angenommen, Sie arbeiten natürlich mit sortierten Listen.
Tags und Links c# collections