Zusammenfassen von zwei CollectionT

8

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.

    
Michael Stum 11.09.2008, 08:57
quelle

5 Antworten

16

Wenn Sie List & lt; & gt; Sie können .AddRange verwenden, um der anderen Liste eine Liste hinzuzufügen.

Oder Sie können die Rendite verwenden, um Listen wie folgt zu kombinieren:

%Vor%     
Mendelt 11.09.2008, 09:06
quelle
1

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.

    
Jon Limjap 11.09.2008 09:13
quelle
1

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.

    
jfs 11.09.2008 09:03
quelle
1

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.

    
Matthew M. Osborn 11.09.2008 09:16
quelle
0

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.

    
ben.biddington 11.09.2008 11:49
quelle

Tags und Links