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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
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!"