2010-01-25 16 views

Odpowiedz

43

Od słownik realizuje IEnumerable<KeyValuePair<Key, Value>>, można po prostu użyć, gdy:

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

Aby odtworzyć nowy słownik, jeśli jest to potrzebne, należy użyć metody ToDictionary.

+7

LINQ czyni życie tak proste! :) – SirDemon

69

Jeśli nie dbają o tworzenie nowego słownika z żądanych przedmiotów i wyrzucać starego, po prostu spróbuj:

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

Jeśli nie można utworzyć nowy słownik i trzeba zmienić stary z jakiegoś powodu (np gdy jest zewnętrznie odwołuje i nie można zaktualizować wszystkie nazwy:.

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

Zauważ, że ToList jest konieczne tutaj ponieważ jesteś modyfikując zbiór podstawowych Jeżeli zmienisz kolekcji podstawowej, moduł wyliczający pracuje to zapytanie o wartości będzie nieużyteczne i wygeneruje wyjątek w kolejnej iteracji pętli. ToList buforuje wartości przed zmianą słownika.

+1

Zastanawiam się, jakie parametry muszę przekazać w metodzie ToDictionary. Dziękuję Ci! +1 – contactmatt

7

można po prostu użyć Linq gdzie klauzuli:

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

dodałem następujące metody rozszerzenie dla mojego projektu, który pozwala filtrować 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; 
     } 
    ); 
} 

Zastosowanie:

IDictionary<int, Person> oldPeople = personIdToPerson.KeepWhen(p => p.age > 29); 
Powiązane problemy