Equals für Arrays?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Equals für Arrays?

    Hallo,

    wie baue ich ein Array dass sich mit anderen vergleichen kann?
    Ich möchte eine List(Of Integer()) anlegen, wobei .Distinct einen Effekt haben kann. Dazu bräuchte ich ein Integer() das IEquatable implementiert.
    Quasi ein EquaNumerable(Of Integer)

    Ich weiß aber nicht wie ich ein Array selbst bastel. Von Array erben kann man nicht. Gerade sowas wie Arr(idx) als Element zu interpretieren habe ich keine Vorstellung wie das aussehen muss in einer Klasse.

    Viele Grüße
    Wenn du zwie Listen miteinander vergleichen willst, gibt's mehrere Möglichkeiten.

    Wie mein Vorredner schon gesagt hat: ​SequenceEqual.

    Wenn es dir um Geschwindigkeit geht, kannst du sowas nutzen:

    VB.NET-Quellcode

    1. dim seq1NotSecond = list1.Except(list2).ToList()
    2. dim seq2NotFirst = list2.Except(list1).ToList()
    3. return not seq1NotSecond.Any() and not seq2NotFirst.Any()


    Alternativ gehen auch HashSets und co
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Geschwindigkeit weiß ich noch nicht ob es an dieser Stelle relevant wird. Könnte aber sein.
    Ich möchte Duplikate aus einer Liste entfernen. Wobei Duplikat bedeutet Array mit gleicher Anordnung gleicher Elemente.

    Mit SequenceEqual prüfe ich zwar zwei Enumerables auf Gleicheit ,da muss ich die Distinct Methode selbst basteln. Aber das werde ich mal versuchen, das klingt nicht so schwer.
    Mit Except entferne ich nur Elemente einer anderen Liste aus der Ersten.

    VB.NET-Quellcode

    1. Dim c = a = b '= leider False


    Ja das kann bei dir nicht funktionieren, denn es wird eine Referenceprüfung (Vergleich beider Referenzen) gemacht. Da es sich um zwei verschiedene Speicherbereiche handelt, wird die Prüfung mit dem Gleichheitszeichen nie ein True liefern.

    Wenn es um die Integer-Werte geht, in der Array, so ist der Ansatz der Vorredner über z.B SequenceEqual(..) ein ganz guter Ansatz.

    Ich versteh jetzt nicht genau warum eine eigene Array gebaut wird, aber anscheinend willst du das so. Man könnte in der eigen gemachten Array das Gleicheitszeichen = überladen (wahrscheinlich muss gleichzeitig auch das <> dann auch noch überladen werden). In diesen zwei Methden kann dann selber gewählt werden, wie die Equal-Prüfung dann ablaufen soll.


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Haudruferzappeltnoch schrieb:

    Mit Except entferne ich nur Elemente einer anderen Liste aus der Ersten.


    Deine Frage war, wie du zwei Arrays miteinander vergleichst.

    Klar, wenn du nicht auf die Reihenfolge achten willst/kannst, dann ist ​SequenceEqual nicht das richtige.
    Mit ​Except erstellst du eine neue Liste; in diesem Fall sogar zwei.

    Diese zwei neuen Listen enthalten alle Elemente, die in den anderen Listen nicht enthalten sind.

    Dann kannst du mit ​Any überprüfen, ob überhaupt Elemente in den Listen enthalten sind. Außer ich verstehe deine Frage falsch, beantwortet das die.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Distinct hat eine Überladung mit einem IEqualityComparer, da brauchst du nicht eine eigene Klasse, wenn du eine Liste aus Arrays distincten willst.

    VB.NET-Quellcode

    1. Public Class IntegerArrayComparer
    2. Inherits IEqualityComparer(Of Integer())
    3. Public Function Equals(ByVal x As Integer(), ByVal y As Integer()) As Boolean
    4. Return Enumerable.SequenceEqual(x, y)
    5. End Function
    6. Public Function GetHashCode(ByVal obj As Integer()) As Integer
    7. Return String.Join(String.Empty, obj).GetHashCode()
    8. End Function
    9. End Class
    10. list = list.Distinct(New IntegerArrayComparer()).ToList()
    @Bluespide Danke, das ist natürlich dann der bessere Weg, als selbst die Distinct neu zu erfinden.

    siycah schrieb:

    Deine Frage war, wie du zwei Arrays miteinander vergleichst

    Das habe ich nicht gefragt. Ich frug nach der Implementation einer Fähigkeit für ein Array sich selbst mit einem zweiten abzugleichen. Bzw. wäre das ja nur eine IEquatable Schnittstelle oder IEqualityComparer Schnittstelle in einer selbst erstellten Array Klasse (hier hätte es gehapert).

    Wie es scheint muss ich das nicht machen, um den weiter umschriebenen Kontext zu erreichen.
    Ich bin noch nicht gewohnt Methoden die ich kenne, auf Features zu prüfen, die ich noch nicht kenne^^
    @Haudruferzappeltnoch Du brauchst eine statische Funktion oder eine Extension, wo zwei Felder reinkommen und wo Du drinne machen kannst, was getan werden muss.
    - selbe Instanz
    - selbe Anzahl an Elementen
    - Gleichheit der Elemente
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!