What are all the array initialization syntaxes that are possible with C#?
17 Answers
These are the current declaration and initialization methods for a simple array.
string[] array = new string[2]; // creates array of length 2, default values
string[] array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
string[] array = new[] { "A", "B" }; // created populated array of length 2
Note that other techniques of obtaining arrays exist, such as the Linq ToArray() extensions on IEnumerable<T>.
Also note that in the declarations above, the first two could replace the string[] on the left with var (C# 3+), as the information on the right is enough to infer the proper type. The third line must be written as displayed, as array initialization syntax alone is not enough to satisfy the compiler's demands. The fourth could also use inference. So if you're into the whole brevity thing, the above could be written as
var array = new string[2]; // creates array of length 2, default values
var array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
var array = new[] { "A", "B" }; // created populated array of length 2
- 119,149
- 26
- 217
- 245
-
4Out of curiosity, could someone explain why the initialisation expression in the 3rd line can't be used by itself (e.g. passed into a method) or be assigned to a `var` variable? – Ruben9922 Sep 11 '19 at 16:49
-
1@Ruben9922: Interesting question. It would make sense that `var x = {}` does not work if the array initializer could yield anything else than arrays, but I would not know what that is. So I guess the array initializer is a language feature. If you use it with `new List
{"A", "B"}`it yields something different, too. – TvdH Nov 06 '19 at 09:38 -
Is there any reason ever to use `string array = new string[] { "A", "B" };` over `string array = { "A", "B" };`? The first just seems redundant. – Lou Dec 11 '20 at 10:28
-
@Lou The syntax comes from the ability to explicitly specify the type in case it cannot be automatically inferred. But of course, in the case of primitive string types that notation definitely seems redundant – Lorenzo Feb 18 '21 at 07:23
-
1@Ruben9922: Interestingly, `Dim a = { "A", "B" }` *does* work in VB.NET (with Option Strict On and Option Infer On) and correctly infers `String()` (`string[]` in C#) as the data type, so I guess the C# designers made a deliberate choice of not supporting this. I guess it was easier to implement in VB, since VB only uses curly braces for array initializations (as opposed to C#, where you have curly braces everywhere). In VB, you can also write `Return {}` in a method that returns an array. – Heinzi Feb 22 '21 at 12:03
The array creation syntaxes in C# that are expressions are:
new int[3]
new int[3] { 10, 20, 30 }
new int[] { 10, 20, 30 }
new[] { 10, 20, 30 }
In the first one, the size may be any non-negative integral value and the array elements are initialized to the default values.
In the second one, the size must be a constant and the number of elements given must match. There must be an implicit conversion from the given elements to the given array element type.
In the third one, the elements must be implicitly convertible to the element type, and the size is determined from the number of elements given.
In the fourth one the type of the array element is inferred by computing the best type, if there is one, of all the given elements that have types. All the elements must be implicitly convertible to that type. The size is determined from the number of elements given. This syntax was introduced in C# 3.0.
There is also a syntax which may only be used in a declaration:
int[] x = { 10, 20, 30 };
The elements must be implicitly convertible to the element type. The size is determined from the number of elements given.
there isn't an all-in-one guide
I refer you to C# 4.0 specification, section 7.6.10.4 "Array Creation Expressions".
- 38,589
- 3
- 81
- 112
- 630,995
- 172
- 1,214
- 2,051
-
1What is the `new[] { ... }` (or `new { ... }` for other types) syntax known as? – BoltClock Apr 15 '11 at 14:44
-
8@BoltClock: The first syntax you mention is an "implicitly typed array creation expression". The second is an "anonymous object creation expression". You do not list the other two similar syntaxes; they are "object initializer" and "collection initializer". – Eric Lippert Apr 15 '11 at 14:48
-
13Not exactly C# "syntax", but let's not forget (my personal favorite) `Array.CreateInstance(typeof(int), 3)`! – Jeffrey L Whitledge Apr 15 '11 at 15:38
-
18@Jeffrey: If we're going down that road,it starts getting silly. E.g., `"1,2,3,4".split(',')`. – Brian Apr 15 '11 at 18:00
-
12Then for multi-dimensional arrays, there exist "nested" notations like `new int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };`, and so on for `int[,,]`, `int[,,,]`, ... – Jeppe Stig Nielsen Jun 07 '13 at 14:23
-
@EricLippert:Is pure array or generic array like abc[] is faster than list because it is written in low level programming language? – Learning-Overthinker-Confused Jan 31 '18 at 13:01
-
1@Learning-Overthinker-Confused: Lists are just wrappers around arrays. It's hard to make something *faster* by *adding indirection*, so lists will be *very slightly* slower. – Eric Lippert Jan 31 '18 at 15:02
-
@EricLippert First of all thank you so much for replying to my comment.I am trying to compare 2 unordered list by getting data from 2 different rdbms and then doing comparision in memory.which will be more efficient for this:Array or list? – Learning-Overthinker-Confused Jan 31 '18 at 15:04
-
7@Learning-Overthinker-Confused: You have two horses. You wish to know which is faster. Do you (1) race the horses, or (2) ask a stranger on the internet who has never seen the horses which one he thinks is faster? **Race your horses**. You want to know which one is more "efficient"? First create a measurable standard for efficiency; remember, efficiency is *value produced per unit cost*, so define your value and cost carefully. Then write the code both ways and measure its efficiency. **Use science to answer scientific questions,** not asking random strangers for guesses. – Eric Lippert Jan 31 '18 at 15:07
-
@EricLippert You are right.I am sorry sir.Actually one of my colleague told me that generic array(t[]) are faster than list because generic or pure array are written in low level programming language.hence i am searching for this that it is true or not – Learning-Overthinker-Confused Jan 31 '18 at 15:09
-
4@Learning-Overthinker-Confused: Remember that "faster" is irrelevant. Your customer does not care about "faster". Your customer cares about *fast enough*. If arrays and lists are so similar that the customer can't tell the difference then it doesn't matter. If arrays and lists are both too slow for the customer's requirements, then which is faster doesn't matter. **Always consider performance with respect to customer scenarios**. You can waste a *lot* of time optimizing code in a way that buys no goodwill from the customer. – Eric Lippert Jan 31 '18 at 15:12
-
3@Learning-Overthinker-Confused: But again, if you have a question about which of two things is faster, write a test and see if there is an *observable* difference. A difference that cannot be observed is a difference that doesn't matter. – Eric Lippert Jan 31 '18 at 15:13
-
@EricLippert Actually i have 2 different rdbms like mysql and oracle which contains millions of records.I want to fetch this millions of records from relevant Rdbms table and then compare them in memory based on some rules.So i am searching for an efficient algorithm and appropriate data structure for this :) – Learning-Overthinker-Confused Jan 31 '18 at 15:18
Non-empty arrays
var data0 = new int[3]var data1 = new int[3] { 1, 2, 3 }var data2 = new int[] { 1, 2, 3 }var data3 = new[] { 1, 2, 3 }var data4 = { 1, 2, 3 }is not compilable. Useint[] data5 = { 1, 2, 3 }instead.
Empty arrays
var data6 = new int[0]var data7 = new int[] { }var data8 = new [] { }andint[] data9 = new [] { }are not compilable.var data10 = { }is not compilable. Useint[] data11 = { }instead.
As an argument of a method
Only expressions that can be assigned with the var keyword can be passed as arguments.
Foo(new int[2])Foo(new int[2] { 1, 2 })Foo(new int[] { 1, 2 })Foo(new[] { 1, 2 })Foo({ 1, 2 })is not compilableFoo(new int[0])Foo(new int[] { })Foo({})is not compilable
- 3,293
- 1
- 25
- 50
-
14It would be good to more clearly separate the invalid syntaxes from the valid ones. – jpmc26 Nov 17 '15 at 18:34
-
Are the given examples complete? Is there any other case? – Intellectual Gymnastics Lover Mar 03 '19 at 11:28
Enumerable.Repeat(String.Empty, count).ToArray()
Will create array of empty strings repeated 'count' times. In case you want to initialize array with same yet special default element value. Careful with reference types, all elements will refer same object.
- 1,803
- 2
- 22
- 25
-
11Yes, in `var arr1 = Enumerable.Repeat(new object(), 10).ToArray();` you get 10 references to the same object. To create 10 distinct objects, you can use `var arr2 = Enumerable.Repeat(/* dummy: */ false, 10).Select(x => new object()).ToArray();` or similar. – Jeppe Stig Nielsen Jun 10 '14 at 13:28
var contacts = new[]
{
new
{
Name = " Eugene Zabokritski",
PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
},
new
{
Name = " Hanying Feng",
PhoneNumbers = new[] { "650-555-0199" }
}
};
- 3,280
- 2
- 25
- 47
- 251
- 3
- 3
-
How are you supposed to use this structure? Is it like a dictionary? – R. Navega Jul 24 '18 at 19:02
-
1
-
@grooveplex It's an array of anonymous types. The anonymous types contain the members Name of type string and PhoneNumbers of type string[]. The types are inferred by the compiler. – Suncat2000 Oct 12 '21 at 18:47
-
In case you want to initialize a fixed array of pre-initialized equal (non-null or other than default) elements, use this:
var array = Enumerable.Repeat(string.Empty, 37).ToArray();
Also please take part in this discussion.
- 3,280
- 2
- 25
- 47
- 97,705
- 120
- 409
- 613
Example to create an array of a custom class
Below is the class definition.
public class DummyUser
{
public string email { get; set; }
public string language { get; set; }
}
This is how you can initialize the array:
private DummyUser[] arrDummyUser = new DummyUser[]
{
new DummyUser{
email = "abc.xyz@email.com",
language = "English"
},
new DummyUser{
email = "def@email.com",
language = "Spanish"
}
};
Repeat without LINQ:
float[] floats = System.Array.ConvertAll(new float[16], v => 1.0f);
- 30,030
- 21
- 100
- 124
- 99
- 1
- 2
Just a note
The following arrays:
string[] array = new string[2];
string[] array2 = new string[] { "A", "B" };
string[] array3 = { "A" , "B" };
string[] array4 = new[] { "A", "B" };
Will be compiled to:
string[] array = new string[2];
string[] array2 = new string[] { "A", "B" };
string[] array3 = new string[] { "A", "B" };
string[] array4 = new string[] { "A", "B" };
- 3,939
- 4
- 49
- 62
int[] array = new int[4];
array[0] = 10;
array[1] = 20;
array[2] = 30;
or
string[] week = new string[] {"Sunday","Monday","Tuesday"};
or
string[] array = { "Sunday" , "Monday" };
and in multi dimensional array
Dim i, j As Integer
Dim strArr(1, 2) As String
strArr(0, 0) = "First (0,0)"
strArr(0, 1) = "Second (0,1)"
strArr(1, 0) = "Third (1,0)"
strArr(1, 1) = "Fourth (1,1)"
- 169,393
- 45
- 393
- 567
-
6Hi, the last block of examples appear to be Visual Basic, the question asks for c# examples. – Alex KeySmith Mar 07 '15 at 11:46
For Class initialization:
var page1 = new Class1();
var page2 = new Class2();
var pages = new UIViewController[] { page1, page2 };
- 35,963
- 5
- 49
- 64
- 219
- 2
- 4
Another way of creating and initializing an array of objects. This is similar to the example which @Amol has posted above, except this one uses constructors. A dash of polymorphism sprinkled in, I couldn't resist.
IUser[] userArray = new IUser[]
{
new DummyUser("abc@cde.edu", "Gibberish"),
new SmartyUser("pga@lna.it", "Italian", "Engineer")
};
Classes for context:
interface IUser
{
string EMail { get; } // immutable, so get only an no set
string Language { get; }
}
public class DummyUser : IUser
{
public DummyUser(string email, string language)
{
m_email = email;
m_language = language;
}
private string m_email;
public string EMail
{
get { return m_email; }
}
private string m_language;
public string Language
{
get { return m_language; }
}
}
public class SmartyUser : IUser
{
public SmartyUser(string email, string language, string occupation)
{
m_email = email;
m_language = language;
m_occupation = occupation;
}
private string m_email;
public string EMail
{
get { return m_email; }
}
private string m_language;
public string Language
{
get { return m_language; }
}
private string m_occupation;
}
- 1,598
- 2
- 21
- 35
For the class below:
public class Page
{
private string data;
public Page()
{
}
public Page(string data)
{
this.Data = data;
}
public string Data
{
get
{
return this.data;
}
set
{
this.data = value;
}
}
}
you can initialize the array of above object as below.
Pages = new Page[] { new Page("a string") };
Hope this helps.
- 3,189
- 4
- 24
- 37
- 192
- 8
hi just to add another way: from this page : https://docs.microsoft.com/it-it/dotnet/api/system.linq.enumerable.range?view=netcore-3.1
you can use this form If you want to Generates a sequence of integral numbers within a specified range strat 0 to 9:
using System.Linq
.....
public int[] arrayName = Enumerable.Range(0, 9).ToArray();
- 567
- 7
- 14
You can also create dynamic arrays i.e. you can first ask the size of the array from the user before creating it.
Console.Write("Enter size of array");
int n = Convert.ToInt16(Console.ReadLine());
int[] dynamicSizedArray= new int[n]; // Here we have created an array of size n
Console.WriteLine("Input Elements");
for(int i=0;i<n;i++)
{
dynamicSizedArray[i] = Convert.ToInt32(Console.ReadLine());
}
Console.WriteLine("Elements of array are :");
foreach (int i in dynamicSizedArray)
{
Console.WriteLine(i);
}
Console.ReadKey();
- 30,030
- 21
- 100
- 124
- 1
- 3
Trivial solution with expressions. Note that with NewArrayInit you can create just one-dimensional array.
NewArrayExpression expr = Expression.NewArrayInit(typeof(int), new[] { Expression.Constant(2), Expression.Constant(3) });
int[] array = Expression.Lambda<Func<int[]>>(expr).Compile()(); // compile and call callback
- 1,344
- 2
- 15
- 24
To initialize an empty array, it should be Array.Empty<T>() in dotnet 5.0
For string
var items = Array.Empty<string>();
For number
var items = Array.Empty<int>();
- 1,576
- 2
- 21
- 37