2010-10-05 9 views
6

Tengo una lista de enteros que contiene una serie de valores (digamos, 200).Cómo eliminar múltiples entradas de una lista sin salir del rango?

List<int> ExampleList; 

Y otra lista en enteros que contiene los índices que deben borrarse de ExampleList. Sin embargo, esta lista no está ordenada.

List<int> RemoveFromExampleList; 

Si se clasifica, se habría corrido un bucle inverso y se eliminan todos los valores como esta:

for (int i = (RemoveFromExampleList.Count-1); i >=0; i--) 
{ 
    ExampleList.RemoveAt(RemoveFromExampleList[i]); 
} 

tengo que ordenar RemoveFromExampleList, o hay otra manera de podar la innecesaria valores de ExampleList?

Si tengo que ordenar, ¿cuál es la forma más fácil de ordenar? ¿Hay alguna biblioteca/método C# incorporado para ordenar?

Respuesta

7

Si RemoveFromExampleList es una lista de índices, deberá ordenarla y trabajar en orden descendente para eliminar en función de esos índices. Si lo hace de otra manera, eliminará valores que no desea eliminar.

+2

Exactamente. Y la ordenación es tan fácil como 'RemoveFromExampleList.Sort();'. Si agrega un '.Reverse()' después, puede 'foreach' a través de la lista. – Heinzi

+0

gracias ... esto funciona! Me siento tonto por no saber que List.Sort() existe ... lol. – xbonez

+0

Me alegro de poder ayudar, xbonez! –

1

Su opción es ordenar, sí. Ordene la lista de eliminación en orden descendente y luego elimínela por índice de esa manera.

// perform an orderby projection, remove 
foreach (int index in RemoveFromExampleList.OrderByDescending(i => i) 
    ExampleList.RemoveAt(index); 

O

// actually sort the list, then remove 
RemoveFromExampleList.Sort((a,b) => b.CompareTo(a)); 
foreach (int index in RemoveFromExampleList) 
    ExampleList.RemoveAt(index); 

(asume que no hay duplicados, utilice .Distinct() en la lista/proyección en caso contrario.)

2

Puede sustituir los valores que se van a retirar con un centinela valor, es decir, uno que sabe que no aparece en la lista, y luego eliminar todas las apariciones de ese valor.

0

Si realmente tenía cierta aversión a ordenar la lista, puede hacer que la lista una lista de enteros con valores nulos:

List<int?> ints; 

entonces se podría anular los valores de la "lista de eliminación", y el uso de la RemoveAll método para eliminar los valores nulos.

Pero esto es obviamente un poco hackeo.

0

Se podía hacerlo con LINQ/Lambda así:

// Ejemplo de eliminar elementos procedentes de otro LISTA Lista MasterList = nueva lista(); masterList.Add (1); masterList.Add (1); masterList.Add (2); masterList.Add (3);

 List<int> itemsToRemove = new List<int>(); 
     itemsToRemove.Add(1); 
     itemsToRemove.Add(2); 
     itemsToRemove.Add(3); 

     List<int> cleanList = new List<int>(); 
     foreach (int value in itemsToRemove) 
     { 
      masterList = masterList.Where(x => x != value).ToList(); 
     } 
3

Aquí está el delineador.

ExampleList.RemoveAll(x => RemoveFromExampleList.Contains(ExampleList.IndexOf(x))); 
Cuestiones relacionadas