Initialize ListInitialize generic Lists in various ways. Use collection initializer expressions.
This page was last reviewed on Oct 21, 2022.
List, initialize. A C# List can be initialized in many ways—we can call Add in a for-loop. But for more clarity, we can use the special initializer syntax.
Shows a listShows a list
With initializer syntax, objects inside a List can set up more easily. In 2021, .NET has advanced optimizations, so syntax here is not that important.
First example. The C# language has many ways to populate a List with values. Many of them are compiled into the same code. We use curly brackets and add elements in expressions.
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.
Shows a 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); } }
3 3 3 3 3
Object List. You can allocate and assign the properties of objects inline with the List initialization. Object initializers and collection initializers share similar syntax.
Version 1 We use a list collection initializer. In the initialization of list 1, 2 Test instances (with properties A and B) are specified.
Version 2 The object initializer syntax is used, and each object is initialized with its constructor.
Program The 2 lists have the same contents—the same number of objects, and each object has the same properties.
Shows a list
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() { // Version 1: initialize list with collection initializer. List<Test> list1 = new List<Test>() { new Test(){ A = 1, B = "B1" }, new Test(){ A = 2, B = "B2" } }; // Version 2: initialize list with new objects. List<Test> list2 = new List<Test>(); list2.Add(new Test() { A = 1, B = "B1" }); list2.Add(new Test() { A = 2, B = "B2" }); // Write number of elements in the lists. Console.WriteLine(list1.Count); Console.WriteLine(list2.Count); } }
2 2
Benchmark, List initializer. Here we test whether List initializers are as fast as a calling the Add method. We create 3-element lists with 2 syntax forms.
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 In 2021 (with .NET 5 on Linux) we find that calling Add() is faster than using a collection initializer. Add() has been sped up.
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")); } }
41.32 ns Collection initializer 31.58 ns Add, Add, Add
Notes, compiler. The C# compiler encounters the curly braces and turns the contents into individual Add method calls on the List. This is true for any List initializer.
List Add
Notes, IL. When examining C# programs that use collection initializers, we see extra temporary variables being created. At runtime, these excess opcodes are eliminated.
A review. Initializing many lists, we explored some specifics of List initializations. We used expression-based syntax to reduce the size of the code file.
Dot Net Perls is a collection of tested code examples. Pages are continually updated to stay current, with code correctness a top priority.
Sam Allen is passionate about computer languages. In the past, his work has been recommended by Apple and Microsoft and he has studied computers at a selective university in the United States.
This page was last updated on Oct 21, 2022 (rewrite).
© 2007-2022 Sam Allen.