Wie würde ich den Vergleich von zwei Listen(Von <CustomClass>) in VB?
Arbeite ich an der Umsetzung der Gleichheits-operator =
für eine benutzerdefinierte Klasse von mir. Die Klasse hat eine Eigenschaft, die Value
, der selbst eine List(Of OtherClass)
, wo OtherClass
ist ein weiteres custom-Klasse in meinem Projekt.
Habe ich bereits umgesetzt IComparer
, IComparable
, IEqualityComparer
, und IEquatable
Schnittstellen, die Betreiber =
, <>
, bool
und not
und überschrieben Equals
und GetHashCode
für OtherClass
. Dieser sollte mir alle Werkzeuge, die ich brauchen den Vergleich dieser Objekte, und verschiedene tests vergleichen zwei einzelne Instanzen dieser Objekte so weit die Kontrollen.
Allerdings bin ich mir nicht sicher, wie man diesen Ansatz, wenn Sie in einer List
. Ich Sorge mich über die Reihenfolge der Liste. Gegeben:
Dim x As New List(Of OtherClass) From
{New OtherClass("foo"),
New OtherClass("bar"),
New OtherClass("baz")}
Dim y As New List(Of OtherClass) From
{New OtherClass("baz"),
New OtherClass("foo"),
New OtherClass("bar")}
Dann (x = y).ToString
ausdrucken sollten Sie True
.
Brauche ich, um zu vergleichen, die die gleiche (nicht unterscheidbare) Objekte in dieser Liste. Die Liste sollte nicht unterstützt betrogenen OtherClass
, aber ich muss herausfinden, wie hinzufügen, dass später, als die Ausnahme. Nicht daran interessiert, die Verwendung von LINQ. Es sieht nett aus, aber in den wenigen Beispielen, die ich gespielt habe, fügt einen performance-overhead, der mich nervt. Loops sind hässlich, aber Sie sind schnell 🙂
Einer geraden code Antwort ist in Ordnung, aber ich würde gerne verstehen, die Logik, die nötig ist für so einen Vergleich als auch. Ich bin wahrscheinlich zu haben, zu implementieren Sprach-Logik mehr als ein paar mal die Straße hinunter.
InformationsquelleAutor Kumba | 2011-01-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deinem Beispiel sollte false zurückgeben. Liste<> bestellt ist Erhebung, und wenn X enthält foo,bar,baz, es ist nicht das gleiche wie baz,foo,bar. Sie sollen nicht zu ändern, diese Art von Verhalten erwartet wird! Was Sie beschreiben, ist ein Satz oder eine Tasche, nicht eine Liste. Tasche ist ähnlich wie die Liste, aber kümmert sich nicht über die Reihenfolge der Elemente. Dann wäre es offensichtlich return true in deinem Beispiel.
Bearbeiten für Klarheit: List<> bestellt wird, durch die Indizes der Elemente, nicht deren Werte. Und diese wichtige Eigenschaft dieser Art der Erhebung beeinflusst deren Verhalten und Geschwindigkeit bei allen Operationen.
OK, vergessen Sie es, und lassen Sie uns sagen, Sie wollen einfach nur, um es zu testen, wie Sie definiert ist. Schnellste univerally applicabel Algorithmus wird O(n*log2n), wenn Sie Sortieren den Inhalt und dann vergleichen.
-1. Sie können die Sortierung der beiden Listen zwei temp-Sammlungen, dann vergleichen Sie einfach Ihre Elemente.
-2. Sie können die Sortierung der X in eine temp-Sammlung, und dann nacheinander gehen durch Y und versuchen Sie zu finden, jedes Element von Y in X, und entfernen Sie es. Am Ende können Sie sehen, wenn temp leer ist, dann X und Y sind die gleichen.
-3. Wenn Sie oft vergleichen auf Gleichheit und nicht so oft fügen Sie neue Elemente erstellen, können Sie einige neue "intelligente" Liste, die Elemente Sortieren mit einfügen. Es besteht aus einer echten Liste<> und eine Art von geordneten Sammlung im inneren.
Grobe Analyse der Komplexität:
Optionen 1. und 2. sind O(n) für das einfügen von n Elementen, und O(n*log2n) auf dem Vergleich von zwei Listen.
Option 3. ist O(n*log2n) für das einfügen von n Elementen, und O(n) auf dem Vergleich von zwei Listen.
Wenn Sie möchten, zu bekommen unter O(n*log2n), haben Sie wahrscheinlich zu gehen, um eine andere Sammlung als Liste<>. Wenn Sie die Klasse HashSet statt (anwesend seit .NET 3.5), kann man wahrscheinlich viel schneller ein Ergebnis. Aber ich habe nicht versucht es in die praxis. HashSet ist eine Implementierung der ungeordnete Sammlung aka-set/Tasche. Es unterstützt nicht den Vergleich von zwei hashsets, aber Sie können dies tun, auf Ihre eigenen auf diese Weise:
Verwenden Sie foreach zu iterieren thru Elemente von X und versuchen Sie, jedes Element in der Y.
Dieser code ist sehr langsam auf Listen, es ist O(n^2). Aber es sollte Recht schnell auf HashSets, O(n). Wenn Sie keine Begegnung mehr versteckte Probleme, diese sollten Fliegen wie eine Rakete!
In der praxis, wenn Sie brauchen, um zu bleiben-mit List<> und wollen die Geschwindigkeit von HashSet<> schreiben Sie einfach einen Ihrer Sammlung (entweder X oder Y) , eine neue Klasse, die enthält zwei Sammlungen innen - Liste<> und ein HashSet<> und speichern alle Elemente auf die beiden zu.
Können Sie auch klassische Wörterbücher<>, HashTable oder einige andere Klassiker-Sammlungen .NET zu implementieren, die gleiche Sache. Sie wird schneller ausgeführt als der Vergleich zweier Lits, aber wohl mehr Speicher benötigen und nicht so schnell wie HashSet.
List(Of T)
war eine geordnete Sammlung. Ich dachte, es war gedacht als eine stark typisierte Auflistung ersetzenArrayList
wenn Sie wissen, dass das array/collection werden immer nur von einem Typ. Die Umsetzung einer sub-Klasse, die beide eine Liste und ein HashSet scheint mir zu viel. Die Ausgabe der Klasse wird eine durch Kommas getrennte Reihe von string-Werte (dies sind die, welche gespeichert sind in der Liste), und ein externes Programm, das verwendet diese Zeichenfolgen kümmert sich nicht um die Reihenfolge.Liste<> und ArrayList sind beide bestellt. (Sie sind wie ein array, und das array ist sortiert.) Wenn HashSet scheint zu viel für Sie ist, verwenden Sie die Sortierung. (Liste<>.Clone() als Liste<>).Sort(), dann vergleichen Sie die Positionen.
Kam nie richtig in mathematische algorithmen zurück in der Schule, also "O(n*log2n)" bedeutet nicht viel für mich. Allerdings, wenn ich brauchen, um mit ungeordneten Sammlungen, und ein HashSet ist schneller, dann werde ich mal schauen, in Schalt - (ich bin immer für performance-Dinge). Obwohl, nicht ein HashSet entstehen Strafen, wenn Sie anfangen, über 10 items? Ich glaube, das ist es, was die
HybridDictionary
Klasse ist.Ah, gut, ist die Bestellung Aspekt wirklich wichtig, wenn die Liste ist einfach nur von meiner custom class für den internen Speicher und ist nie wirklich ausgesetzt, die außerhalb der Klasse in seiner rohen form?
Basic Vergleich von lits ist O(n^2) s ist sehr langsam. In der Regel O(n*log2n) ist schnell genug, aber wenn Sie haben Millionen von Artikeln, kann es langsam auch. O(n) ist viel besser. 🙂
InformationsquelleAutor Al Kepp
ok Al Kepp Ich habe ein problem mit deiner Methode
Ich habe zwei Listen zum Beispiel :
CompList1:
0)Banana
1)apple
2)apple
3)apple
4)Erdbeere
5)Kirsche
6)cherry
7)cherry
8)kiwi
CompList2:
0)apple
1)cherry
und ich brauche, um die index aus jedem match in list1 und fügen Sie es an eine Liste, aus irgendeinem Grund kann ich nicht herausfinden, ich bekomme nur index 1 und 5, 2 3 6 7 nicht Hinzugefügt.
Kann mir jemand helfen ?
EDIT:
Ok, es war mein Missverständnis .IndexOf() - es findet erste Element in der Liste mit text, angegeben in ()
Also muss es so sein, um korrekt zu arbeiten, wie ich wollte:
InformationsquelleAutor Mistr Listr