Wählen Sie ein Element nach Index aus einem .NET HashSet

8

Im Moment verwende ich eine benutzerdefinierte Klasse, die von HashSet abgeleitet ist. Es gibt einen Punkt im Code, wenn ich Elemente unter bestimmten Bedingungen auswähle:

%Vor%

Es funktioniert gut und ich bekomme diese Elemente. Aber gibt es einen Weg, dass ich einen Index dieses Elements innerhalb der Sammlung erhalten könnte, um mit der Methode ElementAt anstelle von ganzen Objekten zu verwenden?

Es würde mehr oder weniger so aussehen:

%Vor%

Manuelles Iterieren über die gesamte Sammlung auf bessere Art und Weise? Ich muss hinzufügen, dass es in einer größeren Schleife ist, so dass diese Where -Klausel für verschiedene someLabel -Zeichenfolgen mehrfach ausgeführt wird.

Bearbeiten

Wofür brauche ich das? clusters ist eine Gruppe von Clustern einiger Dokumentensammlungen. Dokumente werden in Gruppen nach Themenähnlichkeit gruppiert. Daher besteht einer der letzten Schritte des Algorithmus darin, die Kennzeichnung für jeden Cluster zu ermitteln. Aber der Algorithmus ist nicht perfekt und manchmal macht er zwei oder mehr Cluster mit der gleichen Bezeichnung. Was ich tun möchte, ist einfach diese Cluster in eine große zusammenführen.

    
Ventus 30.09.2010, 08:29
quelle

3 Antworten

14

Sätze haben normalerweise keine Indizes. Wenn die Position für Sie wichtig ist, sollten Sie eine List<T> anstelle (oder möglicherweise auch) einer Menge verwenden.

SortedSet<T> in .NET 4 ist etwas anders, da es ein Sortierreihenfolge Es implementiert jedoch immer noch IList<T> nicht, so dass der Zugriff nach Index mit ElementAt langsam ist.

Wenn Sie mehr darüber erfahren könnten, warum Sie diese Funktionalität wünschen, wäre es hilfreich. Dein Anwendungsfall ist im Moment nicht wirklich klar.

    
Jon Skeet 30.09.2010, 08:33
quelle
5

Wenn Sie Elemente in HashSet speichern und manchmal Elemente nach Index abrufen müssen, sollten Sie in solchen Situationen die Erweiterungsmethode ToList () verwenden. Sie verwenden also Funktionen von HashSet und dann nutzen Sie die Vorteile von Indizes.

%Vor%     
Bronek 23.05.2013 20:07
quelle
3

Es gibt keinen Index mit einem Hash-Satz. Eine der Möglichkeiten, wie Hash-Sets in einigen Fällen effizienter werden, besteht darin, sie nicht zu pflegen.

Ich sehe auch nicht, was der Vorteil hier ist. Wenn Sie den Index erhalten und ihn dann verwenden würden, wäre dies weniger effizient als nur das Erhalten des Elements (das Erlangen des Indexes wäre ebenso effizient, und dann haben Sie eine zusätzliche Operation).

Wenn Sie mehrere Operationen für dasselbe Objekt ausführen möchten, halten Sie einfach an diesem Objekt fest.

Wenn Sie etwas für mehrere Objekte tun möchten, tun Sie dies auf der Basis der Iteration (normal foreach oder doing foreach für die Ergebnisse eines Where() usw.). Wenn Sie etwas für mehrere Objekte tun und dann etwas anderes für diese mehreren Objekte tun möchten, und Sie müssen dies in solchen Batches tun, anstatt alle Operationen im selben foreach auszuführen, dann speichern Sie die Ergebnisse des Where() in List<T> .

    
Jon Hanna 30.09.2010 09:08
quelle

Tags und Links