Laden...

System.Collections.Generic.List: eigenartiges Verhalten der Methode Contains(T item)

Erstellt von hollst vor 6 Jahren Letzter Beitrag vor 6 Jahren 979 Views
H
hollst Themenstarter:in
5 Beiträge seit 2013
vor 6 Jahren
System.Collections.Generic.List: eigenartiges Verhalten der Methode Contains(T item)

Hallo, bei folgender Sequenz


System.Collections.Generic.List<int[]> L = new System.Collections.Generic.List<int[]>();
for (int i = 0; i < 5; i++)
  L.Add(new int[] { i, i });
bool bo_contains = L.Contains(new int[] { 1, 1 })
Console.WriteLine(bo_contains);

ergibt bo_contains FALSE, obwohl new int[] { 1, 1 } ohne Zweifel in der Liste enthalten ist, wie leicht mittels


for (var i = 0; i < L.Count; i++)
  Console.WriteLine(L[i][0].ToString() + " " + L[i][1].ToString());

ersichtlich ist.

Kann mir freundlicherweise jemand dieses (unlogische) Verhalten erklären?

Besten Dank im Voraus.

16.806 Beiträge seit 2008
vor 6 Jahren

Weil Du hier keine Werte vergleichst sondern Referenzen - und die Referenzen sind hier nicht identisch.
Contains verhält sich hier absolut korrekt.

Du machst nichts anderes als



var a = new [] {1,1};
var b = new [] {1,1};

var same = a == b;


Sind .NET/C# Basics 😉
[Artikel] Parameter-Übergabemechanismen: call by value vs. call by reference (ref/out)

Du musst nach Inhalten suchen, und das geht in diesem Fall nicht anders als sich jedes Array aus der Liste zu holen, und die Eigenschaften/Inhalte zu vergleichen, statt nur die Referenzen.

3.170 Beiträge seit 2006
vor 6 Jahren

Hallo,

Abt war mal wieder schneller...

um es etwas auszuführen, und damit ich nicht umsonst getippt habe:
Arrays sind Referenztypen, und es wird ein Instanzvergleich durchgeführt wenn man sie vergleicht.

Da Du mit new immer wieder eine neue Instanz erzeugt, sind die Objekte zwar möglicherweise inhaltlich gleich, aber es handelt sich doch um unterschiedliche Objekte.
Deshalb wird das neue Array, nach dem Du suchst, in der Liste nicht gefunden. Es steckt halt nicht drin.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo hollst,

hier könntest du die (Linq-) Überladung / Erweiterung mit einem eigenen EqualityComparer verwenden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"