2016-07-18 17 views
0

Ich habe zwei Listen. Die erste Liste enthält Werte wie Buchstaben und Zahlen. Länge ist [0] - [36]. Zweite Liste enthält ähnliche Werte und Länge ist auch [0] - [36].Listenelement basierend auf Index c entfernen #

Ich wiederhole zweite Liste zweimal mit bestimmten Werten, um einen Indexschlüssel zu greifen, und wenn ich den Indexschlüssel von der zweiten Liste ergreife, möchte ich Elemente in der ersten Liste basierend auf Indizes vom zweiten entfernen.

Problem ist, dass zweite Iteration nicht mehr funktioniert, weil Indexschlüssel in der ersten Liste geändert hat.

Ich sollte wahrscheinlich Liste in ein Array konvertieren (Array hat feste Indexschlüssel, Liste generiert nach), aber ich weiß nicht, wie Indexschlüssel aus einem Array hinzufügen oder entfernen.

Ich benutze nicht Linq.

Schätzen Sie Ihre Hilfe und Vorschläge BR

Codebeispiel:

List<int> list_z = new List<int>(); 
List<int> list_k = new List<int>(); 

for (int i = 0; i < second_list.Count; i++) { 
    if (second_list[i] == "K") 
    { 
    list_k.Add(i); 
    } 
} 

int k = list_k.Count; 

for (int i = 0; i < k; i++) { 
    first_list.RemoveAt(list_k[i]); 
} 

for (int i = 0; i < second_list.Count; i++) 
{ 
    if (second_list[i] == "Z") 
    { 
    list_z.Add(i); 
    } 
} 

int z = list_z.Count; 
for (int i = 0; i < svi_z; i++) 
    first_list.RemoveAt(lista_z[i]); //here is error, because first_list doesnt have index key number 36 anymore 
} 
+1

Können Sie ein Wörterbuch benutzen? Was ist dein Ziel hier? Ich denke, dass es eine viel einfachere Lösung geben könnte. –

Antwort

3

Wenn Elemente aus einer Liste zu entfernen auf Indizes basieren, können Sie sie in absteigender Reihenfolge entfernen sollte (zB Sie sollten 11th entfernen , 8., 3d, 2. Gegenstände - in dieser Reihenfolge). In Ihrem Fall:

list_k.Sort(); 

    for (int i = list_k.Count - 1; i >= 0; --i) 
    first_list.RemoveAt(list_k[i]); 
3

Es gibt eine einfache Lösung für Elemente aus der Liste zu einem bestimmten Index eins nach dem anderen zu entfernen. Um die Indizes absteigend zu ordnen, werden auf diese Weise keine Elemente in der Liste verschoben.

Beispiel:

Die Below wirft einen Fehler:

List<int> list = Enumerable.Range(0, 20).ToList(); 

List<int> indexesToRemove = new List<int>(){ 5, 13, 18 }; 

foreach(int i in indexesToRemove) 
{ 
    list.RemoveAt(i); 
} 

Während, wenn Sie dies tun, werden Sie keine Fehlermeldung erhalten:

List<int> list = Enumerable.Range(0, 20).ToList(); 

List<int> indexesToRemove = new List<int>(){ 5, 13, 18 }; 

foreach(int i in indexesToRemove.OrderByDescending(x => x)) 
{ 
    list.RemoveAt(i); 
} 

Also in Ihrem Fall, die Sie gerade müssen vor der Schleife list_z = list_z.OrderByDescending(x => x).ToList(); anrufen und alles sollte gut funktionieren.

Oder wenn Sie wollen nicht verwenden Linq können Sie wie folgt vorgehen:

list_z.Sort((x, y) => y - x); 
for (int i = 0; i < list_z.Count; i++) 
    first_list.RemoveAt(lista_z[i]); 
} 
1

Oder Sie können, was Sie tun vereinfachen:

 // Iterate and assign null 
     for (var i = 0; i < second_list.Count(); i++) 
     { 
      if (second_list[i] == "K") 
      { 
       first_list[i] = null; 
      } 
     } 

     // Iterate and assign null 
     for (var i = 0; i < second_list.Count; i++) 
     { 
      if (second_list[i] == "Z") 
      { 
       first_list[i] = null; 
      } 
     } 

     // remove nulls without linq or lambda 
     first_list.RemoveAll(delegate (string o) { return o == null; }); 
Verwandte Themen