71

To create an empty sequence one uses the following

var empty = Enumerable.Empty<string> ();

Is there an equivalent for creating an empty dictionary as easily as this?

4
  • What does it have to do with Linq? Commented May 3, 2012 at 12:24
  • Sometimes google helps msdn.microsoft.com/en-us/library/xfhwa508.aspx Commented May 3, 2012 at 12:26
  • 1
    Expected more pro question when rep ~2000. You are by using LINQ shooting a fly with cannon. Just use plain new Dictionary<string, string>(); Commented May 3, 2012 at 12:26
  • 12
    seems like a perfectly good question to me. There is string.empty and Enumerable.Empty why not Dictionary<string,string>.Empty. I can guess at implementation issues but its a perfectly reasonable concept; Commented Jun 13, 2013 at 22:26

8 Answers 8

58

Back to year 2019, there is a way to achieve this, using:

ImmutableDictionary<TKey, TValue>.Empty

More info can be found here (last couple of posts): https://github.com/dotnet/corefx/issues/25023

Sign up to request clarification or add additional context in comments.

5 Comments

Is it limited to some newer versions? I can't seem to find it nor VS nor ReSharper knows about it? Also, is there another alternative otherwise?
I manually found a port for .NET 4.0 on Nugget but sadly found out that foo?.ToDictionary(…) ?? ImmutableDictionary<Foo, Bar>.Empty does not compile. :(
Not sure how I never saw this comment. The issue you have is obvious. ToDictionary() returns Dictionary<K,V>, while ImmutableDictionary<K,V>.Empty returns ImmutableDictionary<K,V>. Although both types implement similar interfaces (e.g. IDictionary<K,V>), the ?? operator doesn't know which type to use for the expression result. For example var a = foo?.ToDictinary<K,V>() ?? ImmutableDictionary<K,V>.Empty is ambiguous, but if you write IDictionary<K,V> a instead of var a the compiler will know what to cast the result of ?? operator into.
As @Stefan mentions below the key is whether you need a Dictionary<K,V> or an IReadOnlyDictionary<K,V>. If you're talking about an immutable object then ImmutableDictionary<K,V>.Empty is what you're after. If you need a mutable dictionary than you'll need to allocate a new one each time because code could add items to the dictionary and you wouldn't want this to happen with a shared object.
I had to add (for a dot-net-core code base) this package ref PackageReference Include="System.Collections.Immutable" Version="a.b.c" 1.7.0 when I wrote this comment.
38

No there is no equivalent...

The purpose of Enumerable.Empty<T>() is to return a "cached" instance of an empty array. So you can avoid the overhead of creating a new array (return new T[0];).

You cannot translate this to a non-readonly structure like a IDictionary<TKey, TValue> or Dictionary<TKey, TValue> since the returned instance might be modified later and would therefore invalidate the purpose...

2 Comments

Yes, there is: ImmutableDictionary<TKey, TValue>.Empty
As @stefan said - there isn't. However to achieve minimal allocations you can create your own static empty dictionary, e.x.: private static readonly Dictionary<string, string> EmptyDictionary = new Dictionary<string, string>() or even an extension to a static (actually cached overtime) single allocation
13

What's wrong with new Dictionary<string, string>()?

3 Comments

An empty Dictionary is mutable and might consume memory as you instanciate it multiple times. He might want a reference to a readonly empty IDictionary<string, string>.
@zx485, immutable empty data-structures are common -when you deal with immutable types- even this question mentions Enumerable.Empty. You can also take a look at the null object pattern but if you really want to know more, you can post a dedicated question here ;)
The reason for the existence of .Empty constructs in c# is to provide a convenient way of acquiring a static, cached, immutable instance of an empty representation of an object, which can be used in places where such objects are required, but not really used, in the code. If you construct a new object every time you just need an empty placeholder, for an object you don't really use, that beats the point of this whole concept.
11

I assume that (at least now 5 years later) empty dictionary really means empty read-only dictionary. This structure is just as useful as an empty enumerable sequence. For instance you might have a configuration type that has a dictionary property (think JSON) that cannot be modified once it has been configured:

public class MyConfiguration
{
    public IReadOnlyDictionary<string, string> MyProperty { get; set; }
}

However, what if the property is never configured? Then MyProperty is null. A good solution to avoiding an unexpected NullReferenceException is to initialize the property with an empty dictionary:

public class MyConfiguration
{
    public IReadOnlyDictionary<string, string> MyProperty { get; set; }
        = new Dictionary<string, string>();
}

The downside is that each allocation of MyConfiguration requires an allocation of an empty dictionary. To avoid this you need something similar to Enumerable.Empty<T>(), i.e. a cached empty read-only dictionary.

There are two ways to achieve this. The first is to take a dependency on System.Collections.Immutable. An ImmutableDictionary<TKey, TValue> implementes IReadOnlyDictionary<TKey, TValue> and it has an Empty field that you can use:

IReadOnlyDictionary<string, string> empty = ImmutableDictionary<string, string>.Empty;

Or you can implement your own empty read-only dictionary similar to Enumerable.Empty<T>() and Array.Empty<T>(). Notice how the empty value is no longer a field and that the class is not generic. Instead it is a generic method. This requires two classes.

The first class is "hidden" and can be internal:

internal static class EmptyReadOnlyDictionary<TKey, TValue>
{
    public static readonly IReadOnlyDictionary<TKey, TValue> Instance
        = new Dictionary<TKey, TValue>();
}

The second class uses the first class but hides it behind the IReadOnlyDictionary<TKey, TValue> interface:

public static class ReadOnlyDictionary
{
    public static IReadOnlyDictionary<TKey, TValue> Empty<TKey, TValue>()
        => EmptyReadOnlyDictionary<TKey, TValue>.Instance;
}

Usage:

IReadOnlyDictionary<string, string> empty = ReadOnlyDictionary.Empty<string, string>();

For both solutions there will only be a single empty dictionary instance for each distinct combination of TKey and TValue.

2 Comments

Great explanation. I would add, if you already went to such an extent, it would be more appropriate to implement the IReadOnlyDictionary with an Empty property/method and not to reuse new Dictionary() in order to prevent addition of elements to that static instance (which was supposed to be empty throughout its lifetime) using a simple casting to Dictionary first (since it was created that way). For example ((Dictionary<K,V>)EmptyReadOnlyDictionary.Instance).Add(k, v) would spoil the emptyness, obviously.
Even doing something like this would have the same effect ((Dictionary<TKey, TValue>)ReadOnlyDictionary.Empty()).Add(key, value)
9

In .NET 8 preview it is possible to create an empty Dictionary by:

ReadOnlyDictionary<TKey, TValue>.Empty;

This way uses no memory and is faster than initiating it with the new keyword.

Comments

2

In C# 12 you can create an empty dictionary this way:

Dictionary<string, string> dict = [];

Comments

-2

When the key and value have the same type (e.g.: string):

Enumerable.Empty<string>().ToDictionary(x=>x, x=>x)

2 Comments

How is this better than new Dictionnary<string,string>() ?
This is instantiating a new Dictionary each time you call it. Enumerable.Empty is an immutable structure, but ToDictionary() will create a fresh new Dictionary from it, which you don't want. You want an immutable empty dictionary.
-2
Enumerable.Empty<KeyValuePair<string, object>>().ToDictionary(kvp => kvp.Key, kvp => kvp.Value)

3 Comments

While this code may answer the question, it is better to explain what it does and add some references to it.
Same comment as for the @Bill Stanton's answer. This is instantiating a new Dictionary each time you call it. Enumerable.Empty is an immutable structure, but ToDictionary() will create a fresh new Dictionary from it, which you don't want. You want an immutable empty dictionary.
you helped me :D

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.