C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Part 1: These first 2 declarations specify 3 strings to be added to a new List.
Part 2: Here the code copies an external array to the internal buffer of the List at runtime. This avoids unnecessary resizing.
Part 3: This code is an unclear way of initializing a List variable in the normal case. But it works.
Part 4: We can avoid a List initializer, and just create an empty list and Add() elements to it.
C# program that initializes string list
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Part 1: use collection initializer.
// ... Use it with var keyword.
List<string> list1 = new List<string>()
{
"carrot",
"fox",
"explorer"
};
var list2 = new List<string>()
{
"carrot",
"fox",
"explorer"
};
// Part 2: use new array as parameter.
string[] array = { "carrot", "fox", "explorer" };
List<string> list3 = new List<string>(array);
// Part 3: use capacity in constructor and assign.
List<string> list4 = new List<string>(3);
list4.Add(null); // Add empty references (BAD).
list4.Add(null);
list4.Add(null);
list4[0] = "carrot"; // Assign those references.
list4[1] = "fox";
list4[2] = "explorer";
// Part 4: use Add method for each element.
List<string> list5 = new List<string>();
list5.Add("carrot");
list5.Add("fox");
list5.Add("explorer");
// Make sure they all have the same number of elements.
Console.WriteLine(list1.Count);
Console.WriteLine(list2.Count);
Console.WriteLine(list3.Count);
Console.WriteLine(list4.Count);
Console.WriteLine(list5.Count);
}
}
Output
3
3
3
3
3
Object initializer: An object initializer sets the individual fields in the object such as properties.
Collection initializer: A collection initializer sets the elements in the collection, not fields.
Next: This example shows an object that has 2 properties A and B, and the properties are set in the List initializer.
PropertyNote: It uses nested curly brackets. In the initialization of list1, two Test instances are allocated with the specified values.
C# program that initializes object Lists
using System;
using System.Collections.Generic;
class Test // Used in Lists.
{
public int A { get; set; }
public string B { get; set; }
}
class Program
{
static void Main()
{
// Initialize list with collection initializer.
List<Test> list1 = new List<Test>()
{
new Test(){ A = 1, B = "Jessica" },
new Test(){ A = 2, B = "Mandy" }
};
// Initialize list with new objects.
List<Test> list2 = new List<Test>();
list2.Add(new Test() { A = 3, B = "Sarah" });
list2.Add(new Test() { A = 4, B = "Melanie" });
// Write number of elements in the lists.
Console.WriteLine(list1.Count);
Console.WriteLine(list2.Count);
}
}
Output
2
2
Version 1: This code uses the List initializer syntax to create a 3-element List of strings.
Version 2: This version of the code uses 3 Add() calls to populate an empty list. The Count is tested to ensure correctness.
Result: The 2 versions of the method take about the same amount of time to execute. We can safely create Lists with either syntax.
C# program that benchmarks List initializer
using System;
using System.Collections.Generic;
using System.Diagnostics;
class Program
{
const int _max = 10000000;
static void Main()
{
// Version 1: use collection initializer.
var s1 = Stopwatch.StartNew();
for (int i = 0; i < _max; i++)
{
List<string> list = new List<string>()
{
"bird",
"frog",
"dog"
};
if (list.Count != 3)
{
return;
}
}
s1.Stop();
// Version 2: use Add method.
var s2 = Stopwatch.StartNew();
for (int i = 0; i < _max; i++)
{
List<string> list = new List<string>();
list.Add("bird");
list.Add("frog");
list.Add("dog");
if (list.Count != 3)
{
return;
}
}
s2.Stop();
Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000000) /
_max).ToString("0.00 ns"));
Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000000) /
_max).ToString("0.00 ns"));
}
}
Output
39.93 ns Collection initializer
39.91 ns Add, Add, Add
Note: The C# language specification states that these temporary variables are used to simplify the process of definite assignment analysis.
And: This proves initialized memory is used. See "The C# Programming Language Third Edition, Special Annotated Edition" page 266.