C# – Filter a dictionary

The simplest way to filter a dictionary is by using the Linq Where() + ToDictionary() methods. Here’s an example:

using System.Linq; var dictionary = new Dictionary<string, int>() { ["fish"] = 3, ["cat"] = 5, ["dog"] = 10 }; //filter var filterList = dictionary.Where(kvp => kvp.Key.StartsWith("d")); //back to a dictionary var newDictionary = filterList.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
Code language: C# (cs)

Note: You can use the Dictionary constructor (new Dictionary<string, int>(filterList)) instead of ToDictionary() if you prefer.

This produces a new dictionary with the filtered item:

[dog, 10]
Code language: plaintext (plaintext)

Where() produces a list (actually an IEnumerable) of KeyValuePair objects. Most of the time, you’ll want the results as a dictionary, not a list. This is why you’ll want to use ToDictionary() to convert this list to a dictionary.

Filter by removing items

The other option for filtering a dictionary is to remove the items you don’t want. This modifies the original dictionary, instead of producing a new one. The simplest way to do this is to use the Linq Where() method + remove the items in a loop. Here’s an example of how to do that:

using System.Linq; var dictionary = new Dictionary<string, int>() { ["fish"] = 3, ["cat"] = 5, ["dog"] = 10 }; //filter var filterList = dictionary.Where(kvp => !kvp.Key.StartsWith("d")); //remove from original dictionary foreach(var kvp in filterList) { dictionary.Remove(kvp.Key); }
Code language: C# (cs)

This removes items from the original dictionary, which now has one item remaining:

[dog, 10]
Code language: plaintext (plaintext)

Before .NET Core 3.0 – Use .ToList() when removing

In .NET Core 3.0, they made it so you could remove from a dictionary while looping over it. Before that, you’d get an exception trying to do that: InvalidOperationException: Collection was modified; enumeration operation may not execute.

If you’re using a version before .NET Core 3.0, use .ToList() to avoid this exception while removing items:

//filter var filterList = dictionary.Where(kvp => !kvp.Key.StartsWith("d")); //remove from original dictionary foreach(var kvp in filterList.ToList()) { dictionary.Remove(kvp.Key); }
Code language: C# (cs)

Leave a Comment