C# provides a number of ways of initializing collections.
If a collection has a single-parameter Add method, you can add items into the collection as part of initialization:
var list = new List<int> { 1, 2, 3 };
// Equivalent to
var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
Note that if you do not provide an argument list after the type, one will be provided for you, namely ().
If a collection has a multi-parameter Add method, you can add items into the collection as part of the initialization, but you need to put braces around each parameter list:
var dict = new Dictionary<int, int> {
{ 0, 1 },
{ 1, 2 },
};
// Equivalent to
var dict = new Dictionary<int, int>();
dict.Add(0, 1);
dict.Add(1, 2);
If a collection has an index setter, you can add items into the collection with indexer syntax:
var dict = new Dictionary<int, int> {
[0] = 1,
[1] = 2,
};
// Equivalent to
var dict = new Dictionary<int, int>();
dict[0] = 1;
dict[1] = 2;
You cannot combine these different initializer notations, however.
// Code in italics doesn't compile
var dict = new Dictionary<int, int> {
{0, 1 },
[1] = 2,
};
However, one thing that is sometimes interesting to do is combine the constructor with the collection initializer. This lets you clone a collection and then modify it.
// Resulting list is { 1, 2, 3, 4, 5 }
var list2 = new List<int>(list) { 4, 5 };
// Resulting list is { 4, 2, 3 }
var list3 = new List<int>(list) { [0] = 4 };
// Resulting dictionary is dict2[0] = 1, dict2[1] = 2,
// and dict[2] = 3
var dict2 = new Dictionary<int, int>(dict) { [2] = 3 };
// Resulting dictionary is dict2[0] = 4, dict2[1] = 2
var dict2 = new Dictionary<int, int>(dict) { [0] = 4 };
You can pass anything that is a valid constructor parameter. For example, List<T> permits construction from any enumerable, so you can do this:
string[] ab = new string[] { "a", "b" };
List<string> abcd = new List<string>(ab) { "c", "d" };
// abcd has four elements: "a" "b" "c" and "d"
This combination notation is useful if you want to clone an existing collection and then make some tweaks to it.
0 comments