Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to remove multiple items matching a predicate from a .NET Dictionary?

I need to remove multiple items from a Dictionary. A simple way to do that is as follows :

  List<string> keystoremove= new List<string>();   foreach (KeyValuePair<string,object> k in MyCollection)      if (k.Value.Member==foo)         keystoremove.Add(k.Key);   foreach (string s in keystoremove)         MyCollection.Remove(s); 

The reason why I can't directly Remove the items in the foreach block is that this would throw an Exception ("Collection was modified...")

I'd like to do the following :

 MyCollection.RemoveAll(x =>x.Member==foo) 

But the Dictionary<> class doesn't expose a RemoveAll(Predicate<> Match) method, like the List<> Class does.

What's the best way (both performance wise and elegant wise) to do that?

like image 347
Brann Avatar asked Jan 22 '09 13:01

Brann


People also ask

How to remove multiple values from Dictionary in c#?

I need to remove multiple items from a Dictionary. A simple way to do that is as follows : List<string> keystoremove= new List<string>(); foreach (KeyValuePair<string,object> k in MyCollection) if (k. Value.

How do you clear a dictionary in C#?

To initialize a dictionary to an empty dictionary, use the Clear() method. It clears the dictionary and forms it as empty.


1 Answers

Here's an alternate way

foreach ( var s in MyCollection.Where(kv => kv.Value.Member == foo).ToList() ) {   MyCollection.Remove(s.Key); } 

Pushing the code into a list directly allows you to avoid the "removing while enumerating" problem. The .ToList() will force the enumeration before the foreach really starts.

like image 146
JaredPar Avatar answered Sep 28 '22 08:09

JaredPar