HashSets abziehen (und eine Kopie zurückgeben)?

8

Ich habe ein HashSet,

%Vor%

Und eine Reihe von Untergruppen,

%Vor%

Ich möchte einen Chunk subtrahieren, was ich so machen kann:

%Vor%

Aber ExceptWith funktioniert direkt. Ich möchte das universe nicht ändern. Soll ich es zuerst klonen, oder gibt es einen besseren Weg?

    
mpen 09.10.2010, 19:33
quelle

5 Antworten

8
  

Ich denke, ich sollte es klonen   zuerst? Wie mache ich das?

%Vor%

Nicht so einfach wie bei der Except Erweiterungsmethode, aber wahrscheinlich schneller (Sie sollten ein paar Leistungstests durchführen, um sicher zu gehen)

    
Thomas Levesque 09.10.2010, 21:58
quelle
9

Wie wäre es mit Except() ?

%Vor%     
James McNellis 09.10.2010 19:37
quelle
4

Ich habe Linqs Except -Methode gegen Klonen und die Verwendung der HashSet-nativen Funktion ExceptWith getestet. Hier sind die Ergebnisse.

%Vor%
  

Linq: 1297 ms
  Nativ: 762 ms

Ссылка

    
mpen 31.12.2010 05:10
quelle
1

Ein Hash-Satz muss seine Hash-Algorithmus-Konstanten und seine Überlauf-Bins verfolgen. Die Elemente in dem Satz werden durch Bezugnahme gehalten. Das Erstellen eines neuen Hash mit dem Copy-Konstruktor, wie Thomas Levesque vorschlägt, erzeugt eine flache Kopie dieses Overheads und sollte ziemlich schnell sein. Die Verwendung von Except () in der von James McNellis vorgeschlagenen Weise erstellt zuerst eine anonyme Kopie und übergibt diese dann an den Kopierkonstruktor, der die Felder im Anonymen verwendet, um seine eigenen Felder zu initialisieren. Wie Thomas sagte, könnten Sie ein paar Leistungstests durchführen, aber theoretisch sollte seine Antwort die Antwort von James schlagen. Und nebenbei, zu meiner Art zu denken, ist eine seichte Kopie kein Klon, da ich glaube, dass ein Klon impliziert, dass die zugrunde liegenden Elemente ebenfalls kopiert werden. Hash-Sets mit gemeinsamen Elementen verwenden eine Kopie, wenn die Strategie geändert wurde.

    
verisimilidude 09.10.2010 23:57
quelle
0

Sehr späte Antwort, aber manchmal vielleicht nützlich.

@mpen hat mit Linq's Except (IEnumerable

) geantwortet

Was macht linq Schleife durch IEnumerable prüfen, ob es enthält.

Wie wäre es mit

?
  

setA.Where (i = & gt;! setB.Contains (i))

    
b.ben 03.02.2018 06:32
quelle

Tags und Links