Proper way to initialize a C# dictionary with values

I am creating a dictionary in a C# file with the following code:

private readonly Dictionary<string, XlFileFormat> FILE_TYPE_DICT = new Dictionary<string, XlFileFormat> { {"csv", XlFileFormat.xlCSV}, {"html", XlFileFormat.xlHtml} };

There is a red line under new with the error:

Feature 'collection initilializer' cannot be used because it is not part of the ISO-2 C# language specification

What is going on here?

I am using .NET version 2.

2

8 Answers

I can't reproduce this issue in a simple .NET 4.0 console application:

static class Program
{ static void Main(string[] args) { var myDict = new Dictionary<string, string> { { "key1", "value1" }, { "key2", "value2" } }; Console.ReadKey(); }
}

Can you try to reproduce it in a simple Console application and go from there? It seems likely that you're targeting .NET 2.0 (which doesn't support it) or client profile framework, rather than a version of .NET that supports initialization syntax.

5

With C# 6.0, you can create a dictionary in the following way:

var dict = new Dictionary<string, int>
{ ["one"] = 1, ["two"] = 2, ["three"] = 3
};

It even works with custom types.

2

You can initialize a Dictionary (and other collections) inline. Each member is contained with braces:

Dictionary<int, StudentName> students = new Dictionary<int, StudentName>
{ { 111, new StudentName { FirstName = "Sachin", LastName = "Karnik", ID = 211 } }, { 112, new StudentName { FirstName = "Dina", LastName = "Salimzianova", ID = 317 } }, { 113, new StudentName { FirstName = "Andy", LastName = "Ruth", ID = 198 } }
};

See How to initialize a dictionary with a collection initializer (C# Programming Guide) for details.

2

Suppose we have a dictionary like this:

Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "Mohan");
dict.Add(2, "Kishor");
dict.Add(3, "Pankaj");
dict.Add(4, "Jeetu");

We can initialize it as follows.

Dictionary<int, string> dict = new Dictionary<int, string>
{ { 1, "Mohan" }, { 2, "Kishor" }, { 3, "Pankaj" }, { 4, "Jeetu" }
};
1

Object initializers were introduced in C# 3.0. Check which framework version you are targeting.

Overview of C# 3.0

Note that C# 9 allows Target-typed new expressions so if your variable or a class member is not abstract class or interface type duplication can be avoided:

 private readonly Dictionary<string, XlFileFormat> FILE_TYPE_DICT = new () { { "csv", XlFileFormat.xlCSV }, { "html", XlFileFormat.xlHtml } };

With ะก# 6.0

var myDict = new Dictionary<string, string>
{ ["Key1"] = "Value1", ["Key2"] = "Value2"
};
2

The code looks fine. Just try to change the .NET framework to v2.0 or later.

1

You Might Also Like