2010-01-25 20 views

Respuesta

43

Desde Diccionario implementa IEnumerable<KeyValuePair<Key, Value>>, sólo se puede utilizar cuando:

var matches = dictionary.Where(kvp => !kvp.Value.BooleanProperty); 

para recrear un nuevo diccionario, si lo necesita, utilice el método ToDictionary.

+7

LINQ hace la vida más fácil! :) – SirDemon

69

Si no se preocupan por la creación de un nuevo diccionario con los elementos deseados y tirar el viejo, simplemente tratar:

dic = dic.Where(i => i.Value.BooleanProperty) 
     .ToDictionary(i => i.Key, i => i.Value); 

Si no se puede crear un nuevo diccionario y la necesidad de modificar la una antigua por alguna razón (como cuando se hace referencia externamente y no se puede actualizar todas las referencias:.

foreach (var item in dic.Where(item => !item.Value.BooleanProperty).ToList()) 
    dic.Remove(item.Key); 

Tenga en cuenta que es necesario ToList aquí, ya que se está modificando la colección subyacente Si cambia la colección subyacente, el enumerador trabajando en para consultar los valores será inutilizable y arrojará una excepción en la siguiente iteración de bucle. ToList guarda en caché los valores antes de alterar el diccionario.

+1

Me preguntaba qué parámetros necesitaba pasar en el método ToDictionary. ¡Gracias! +1 – contactmatt

7

puede simplemente usar el Linq cláusula where:

var filtered = from kvp in myDictionary 
       where !kvp.Value.BooleanProperty 
       select kvp 
0

I añade el siguiente método de extensión para mi proyecto, que le permite filtrar un IDictionary.

public static IDictionary<keyType, valType> KeepWhen<keyType, valType>(
    this IDictionary<keyType, valType> dict, 
    Predicate<valType> predicate 
) { 
    return dict.Aggregate(
     new Dictionary<keyType, valType>(), 
     (result, keyValPair) => 
     { 
      var key = keyValPair.Key; 
      var val = keyValPair.Value; 

      if (predicate(val)) 
       result.Add(key, val); 

      return result; 
     } 
    ); 
} 

Uso:

IDictionary<int, Person> oldPeople = personIdToPerson.KeepWhen(p => p.age > 29); 
Cuestiones relacionadas