Array vergleichen
-
Hallo,
ich möchte gerne 2 Array vergleichen, dieser Code klappt nicht!
Wieso? Vergleicht er auch die Speicheradresse?int[] _int1 = new int[] { 1, 2, 3 }; int[] _int2 = new int[] { 1, 2, 3 }; if (_int1 == _int2) { MessageBox.Show("1"); } else { MessageBox.Show("0"); }
Wäre über eine Antwort sehr froh...
Gruß
Frank
-
Wenn du 2 Arrays vergleichen willst, musst du alle einzelnen Items der beiden Arrays vergleichen. Array1 kann nie Array2 gleichen esseidenn du hast eine Kopie.
-
Frankyi schrieb:
ich möchte gerne 2 Array vergleichen, dieser Code klappt nicht!
Wieso? Vergleicht er auch die Speicheradresse?Arrays sind Referenztypen und deswegen wird hier auch ein Vergleich der Referenzen durchgeführt.
Wie schon geschrieben, ist für einen Inhaltsvergleich ein Durchlaufen der Arrays sowie Prüfung der Elemente (auch hier darauf achten, ob du Referenz- oder Werttypen hast) notwendig.
-
Danke für die schnellen Antworten.
Aber ein String ist doch auch ein Referenztyp und lässt sich problemlos vergleichen!?
"Ein Referenz-Typ wird auf dem Heap gespeichert, auf dem Stack gibt es einen Verweis auf die Speicheradresse im Heap".
Hängt das dann also doch mit der Speicheradresse zusammen?
-
Frankyi schrieb:
Aber ein String ist doch auch ein Referenztyp und lässt sich problemlos vergleichen!?
Das liegt daran, dass der == operator bei Strings überladen ist, um einen Wertvergleich durchzuführen.
-
Frankyi schrieb:
Aber ein String ist doch auch ein Referenztyp und lässt sich problemlos vergleichen!?
Schau dir dazu am besten den Artikel Besonderheiten der String-Klasse (immutabler Referenztyp mit Wertsemantik)
-
warum nicht einfach
Enumerable.SequenceEquals(_int1, _int2)
-
Danke für die Antwort.
Kommt aus Basic!?
Kann man das so verwenden!? Ist das Sicher!?
-
Frankyi schrieb:
Kann man das so verwenden!? Ist das Sicher!?
Nein bei jedem zehnten Aufruf explodiert eine Plasmaleitung im Monitor.
ILSpy:
public static bool SequenceEqual<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) { return first.SequenceEqual(second, null); } public static bool SequenceEqual<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer) { if (comparer == null) { comparer = EqualityComparer<TSource>.Default; } if (first == null) { throw Error.ArgumentNull("first"); } if (second == null) { throw Error.ArgumentNull("second"); } using (IEnumerator<TSource> enumerator = first.GetEnumerator()) { using (IEnumerator<TSource> enumerator2 = second.GetEnumerator()) { while (enumerator.MoveNext()) { if (!enumerator2.MoveNext() || !comparer.Equals(enumerator.Current, enumerator2.Current)) { bool result = false; return result; } } if (enumerator2.MoveNext()) { bool result = false; return result; } } } return true; }