2016-07-05 23 views
1

Ich versuche, Artikel aus List<string[]> zu entfernen, aber entfernen Eigenschaft funktioniert nicht, aber wenn ich RemoveAt(0) (alle int hardcoded Wert) dann funktioniert es ... Was könnte ein Problem sein. Kann mir jemand helfen?Entfernen Sie den Artikel von der Liste <string[]> oder Index von einem beliebigen Artikel an jeder Position

Hier ist mein Code ...

List<string[]> ipcol1 = new List<string[]>(); 
ipcol1.Add(new string[] { "test1" }); 
ipcol1.Add(new string[] { "test2" }); 
ipcol1.Add(new string[] { "test3" }); 
ipcol1.Add(new string[] { "test4" }); 
ipcol1.Remove(new string[] { "test1" }); 

int i = ipcol1.IndexOf(new string[] { "test4" }); 
ipcol1.RemoveAt(i); 

Oder wenn ich Index perticular Artikel versuche ich es geben nehmen dann (-1) als Ergebnis ... Wenn ich Index dieses Problem bekommen dann kann mein Problem lösen ... Bitte hilf mir.

+0

Das String-Array, das Sie der Liste hinzufügen, ist nicht dasselbe wie das, das Sie in 'IndexOf' verwenden. Sie können den gleichen Wert haben, aber sie sind nicht die gleiche Instanz. Da Arrays * Referenz * -Typen sind, wird keiner Ihrer Artikel identisch sein. –

Antwort

6

Sie haben SequenceEqual zu verwenden, wenn Arrays Vergleich:

List<string[]> ipcol1 = new List<string[]>(); 
    ipcol1.Add(new string[] { "test1" }); 
    ipcol1.Add(new string[] { "test2" }); 
    ipcol1.Add(new string[] { "test3" }); 
    ipcol1.Add(new string[] { "test4" }); 

    ipcol1.RemoveAll(array => array.SequenceEqual(new string[] { "test1" })); 

Oder (falls Sie auf einen Eintrag entfernen möchten, die "test1" irgendwo in Array enthält):

ipcol1.RemoveAll(array => array.Any(item => item == "test1"))); 

Der Grund dafür ist, dass zwei Arrays sind gleich, wenn sie die gleiche Referenz haben:

string[] array1 = new string[0]; 
    string[] array2 = array1; 
    string[] array3 = new string[0]; 

    // "Yes" - array1 and array2 reference to the instance 
    Console.WriteLine((array1 == array2) ? "Yes" : "No"); 
    // "No" - array1 and array3 are references to different instances 
    Console.WriteLine((array1 == array3) ? "Yes" : "No"); 

    // "Yes" - array1 and array3 are equal sequences 
    Console.WriteLine((array1.SequenceEqual(array3)) ? "Yes" : "No"); 
0

Die Arrays sind Referenztypen. Der folgende Code schlägt fehl, weil Sie die Verweise von zwei separaten Instanzen vergleichen.

ipcol1.Remove(new string[] { "test1" }); 

Sie können SequenceEqual verwenden, um Sammlungen zu vergleichen.