2012-10-09 26 views
5

Tengo List<string> AllowedList y Dictionary<string,List<string>> MyDictionary.borrar clave, pares de valores de un diccionario dada una lista de claves para eliminar

Para cada clave en el diccionario, quiero comprobar si está en el AllowedList, si no quiero borrar la clave y el valor del diccionario.

intuitivamente yo probamos este, que parece ser lo que quería:

foreach (string key in MyDictionary.Keys) 
{ 
    if (!AllowedList.Contains(key)) MyDictionary.Remove(key); 
} 

Sin embargo, me encontré con un InvalidOperationException: Colección

se modificó; la operación de enumeración no se puede ejecutar.

Estoy seguro de que hay una forma sencilla de evitar esto, pero no lo veo de inmediato.

Respuesta

9

Usted podría utilizar Enumerable.Except para encontrar las llaves que no están en el diccionario:

foreach (var key in MyDictionary.Keys.Except(AllowedList).ToList()) 
    MyDictionary.Remove(key); 

El ToList() crea una nueva lista del conjunto diferencia y evita la excepción.

+1

+1 y creo que la primera línea se puede simplificar a 'var keys = MyDictionary.Keys;' – farfareast

+2

La solución de Seismoid también es válida. Sin embargo, me gusta más esta sugerencia de diferencia de set de linq. – user17753

1

Puede/debe almacenar las claves que desea eliminar en una lista temporal y luego eliminar todo en un bucle for adicional.

List<TKey> templist = new List<TKey>(); 

foreach (var x in MyDictionary) 
{ 
    if (!AllowedList.Contains(x.Key)) 
     templist .Add(x.Key); 
} 
foreach (TKey item in templist) 
{ 
    MyDictionary.Remove(item); 
} 

esto también podría ser útil: How to delete entries from a dictionary using the value

Cuestiones relacionadas