Frage

Ich habe eine Funktion, die a zurückgibt Collection<string>, und das ruft sich rekursiv auf, um schließlich einen großen Wert zurückzugeben Collection<string>.

Jetzt frage ich mich nur, was der beste Ansatz ist, um die Listen zusammenzuführen. Collection.CopyTo() kopiert nur nach string[] und verwendet a foreach() Schleife scheint ineffizient zu sein.Da ich jedoch auch Duplikate herausfiltern möchte, habe ich das Gefühl, dass ich am Ende ein foreach bekomme, das aufruft Contains() auf der Collection.

Ich frage mich, ob es eine effizientere Möglichkeit gibt, eine rekursive Funktion zu haben, die eine Liste von Zeichenfolgen ohne Duplikate zurückgibt?Ich muss kein verwenden Collection, es kann so ziemlich jeder geeignete Datentyp sein.

Einziger Ausschluss, ich bin an Visual Studio 2005 und .net 3.0 gebunden, also kein LINQ.

Bearbeiten: Um klarzustellen:Die Funktion entnimmt einem Benutzer Active Directory, schaut sich die direkten Berichte des Benutzers an und schaut sich dann rekursiv die direkten Berichte jedes Benutzers an.Das Endergebnis ist also eine Liste aller Benutzer, die sich in der „Befehlskette“ eines bestimmten Benutzers befinden. Da dies recht häufig ausgeführt wird und bei einigen Benutzern derzeit 20 Sekunden dauert, suche ich nach Möglichkeiten, es zu verbessern.Das Ergebnis 24 Stunden lang zwischenzuspeichern steht übrigens auch auf meiner Liste, aber ich möchte sehen, wie ich es verbessern kann, bevor ich die Zwischenspeicherung anwende.

War es hilfreich?

Lösung

Wenn Sie mit List <> Sie .AddRange verwenden können, eine Liste in der anderen Liste hinzuzufügen.

Sie können auch yield return verwenden, um Listen on the fly wie folgt kombiniert werden:

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

Andere Tipps

Sie können einen Blick auf Iesi.Collections und nehmen möchten < a href = "http://www.codeproject.com/KB/recipes/GenericISet.aspx?display=Print" rel = "nofollow noreferrer"> Allgemein Iesi.Collections Extended (weil die erste Auflage gemacht wurde 1.1, wenn es keine Generika noch) nicht.

Erweiterte Iesi eine ISet Klasse hat, die genau als HashSet wirkt. Es erzwingt einzigartige Mitglieder und erlaubt keine Duplikate

Die nette Sache über Jesi ist, dass es Betreiber anstelle von Methoden für die Zusammenführung Sammlungen festgelegt hat, so haben Sie die Wahl zwischen einer Gewerkschaft haben (|)., Kreuzung (&), XOR (^) und so weiter

Ich denke, HashSet<T> ist eine große Hilfe.

  

Die HashSet<T> Klasse stellt   Hochleistungs-Set-Operationen. Eine Reihe   Eine Sammlung ist, die nicht enthält   doppelte Elemente und deren Elemente   in keiner bestimmten Reihenfolge ist.

Just Elemente hinzufügen und dann CopyTo verwenden.


Aktualisieren : HashSet<T> ist in .NET 3.5

Vielleicht können Sie verwenden Dictionary<TKey, TValue> . einen doppelten Schlüssel zu einem Wörterbuch Einstellung wird eine Ausnahme nicht erhöhen.

Können Sie die Sammlung in ihr Verfahren durch refernce geben, so dass Sie nur Elemente hinzufügen können, auf diese Weise Sie nicht etwas zurückgeben müssen. Dies ist, was es aussehen könnte, wenn Sie es in c # getan haben.

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

Wie bereits erwähnt durch @Zooba durch ref Passing ist hier nicht erforderlich, wenn Sie mit dem Wert vorbei wird es auch funktionieren.

Was Verschmelzung geht:

  

Ich frage mich, ist es eine effizientere   Art und Weise eine rekursive Funktion zu haben,   gibt eine Liste von Strings ohne   Duplikate? Ich muss nicht verwenden   Sammlung, kann es ziemlich viel sein jeder   geeigneter Datentyp.

Ihre Funktion fügt einen Rückgabewert, nicht wahr? Sie spalten die mitgelieferte Liste in der Hälfte, selbst wieder aufgerufen wird (zweimal) und dann die Ergebnisse zusammengeführt werden.

Während des Verschmelzungsschrittes, warum nicht nur überprüfen, bevor Sie jede Saite zu dem Ergebnis hinzufügen? Wenn es bereits vorhanden ist, überspringen Sie es.

Angenommen, Sie mit sortierten Listen natürlich arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top