所有可能的数组初始化语法


Answers:


776

这些是简单数组的当前声明和初始化方法。

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

请注意,还存在其他获取数组的技术,例如上的Linq ToArray()扩展IEnumerable<T>

还要注意,在上面的声明中,前两个可以string[]var(C#3+)代替左侧的,因为右侧的信息足以推断正确的类型。第三行必须按显示方式编写,因为仅数组初始化语法不足以满足编译器的需求。第四个也可以使用推断。因此,如果您全神贯注,上面的内容可以写成

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 

1
出于好奇,有人可以解释为什么第三行中的初始化表达式本身不能使用(例如,传递给方法)或不能分配给var变量吗?
–'Ruben9922

1
@ Ruben9922:有趣的问题。var x = {}如果数组初始值设定项可以产生除数组以外的任何内容,那是不可行的,但我不知道那是什么。所以我猜想数组初始化器是一种语言功能。如果与它一起使用new List<string> {"A", "B"},也会产生不同的结果。
TvdH

441

C#中作为表达式的数组创建语法为:

new int[3]
new int[3] { 10, 20, 30 }
new int[] { 10, 20, 30 }
new[] { 10, 20, 30 }

在第一个中,大小可以是任何非负整数值,并且数组元素将初始化为默认值。

在第二个中,大小必须为常数,并且给定的元素数必须匹配。从给定元素到给定数组元素类型必须进行隐式转换。

在第三个元素中,元素必须隐式转换为元素类型,并且大小由给定的元素数量确定。

在第四个中,通过计算所有给定的具有类型的元素中的最佳类型(如果存在)来推断数组元素的类型。所有元素都必须隐式转换为该类型。大小由给定的元素数确定。此语法在C#3.0中引入。

还有一种语法只能在声明中使用:

int[] x = { 10, 20, 30 };

元素必须隐式转换为元素类型。大小由给定的元素数确定。

没有多合一的指南

我请您参考C#4.0规范的第7.6.10.4节“数组创建表达式”。


8
@BoltClock:您提到的第一个语法是“隐式类型的数组创建表达式”。第二个是“匿名对象创建表达式”。您没有列出其他两种类似的语法;它们是“对象初始化器”和“集合初始化器”。
埃里克·利珀特

11
不完全是C#“语法”,但不要忘记(我个人最喜欢的)Array.CreateInstance(typeof(int), 3)
Jeffrey L Whitledge 2011年

17
@杰弗里:如果我们走这条路,那就开始变得愚蠢了。例如"1,2,3,4".split(',')
布莱恩

11
然后,对于多维数组,存在“嵌套”的符号,如new int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };,等为int[,,]int[,,,],...
叶普斯蒂尼尔森

6
@ Learning-Overthinker-Confused:你有两匹马。您想知道哪个更快。您(1)赛马,还是(2)在互联网上问一个从未见过他认为更快的马的陌生人? 赛马。您想知道哪个更“有效”吗?首先创建一个可衡量的效率标准;请记住,效率是单位成本产生的价值,因此请仔细定义您的价值和成本。然后以两种方式编写代码并评估其效率。用科学回答科学问题,而不要问随机的陌生人猜测。
埃里克·利珀特

111

非空数组

  • 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 }是不可编译的。使用int[] data5 = { 1, 2, 3 }代替。

空数组

  • var data6 = new int[0]
  • var data7 = new int[] { }
  • var data8 = new [] { } 并且int[] data9 = new [] { }不可编译。

  • var data10 = { }是不可编译的。使用int[] data11 = { } 代替。

作为方法的论点

只有可以用var关键字分配的表达式才能作为参数传递。

  • Foo(new int[2])
  • Foo(new int[2] { 1, 2 })
  • Foo(new int[] { 1, 2 })
  • Foo(new[] { 1, 2 })
  • Foo({ 1, 2 }) 是不可编译的
  • Foo(new int[0])
  • Foo(new int[] { })
  • Foo({}) 是不可编译的

14
最好将无效语法与有效语法区分开来。
jpmc26 2015年

给出的示例是否完整?还有其他情况吗?
面向货币的程序员,

49
Enumerable.Repeat(String.Empty, count).ToArray()

将创建重复“计数”次的空字符串数组。如果要使用相同但特殊的默认元素值初始化数组。小心引用类型,所有元素都将引用同一对象。


5
是的,var arr1 = Enumerable.Repeat(new object(), 10).ToArray();您将获得10个对同一对象的引用。要创建10个不同的对象,可以使用var arr2 = Enumerable.Repeat(/* dummy: */ false, 10).Select(x => new object()).ToArray();或类似的对象。
Jeppe Stig Nielsen 2014年

20
var contacts = new[]
{
    new 
    {
        Name = " Eugene Zabokritski",
        PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
    },
    new 
    {
        Name = " Hanying Feng",
        PhoneNumbers = new[] { "650-555-0199" }
    }
};

您应该如何使用这种结构?它像字典吗?
R. Navega

1
@ R.Navega,这是一个普通数组:)
grooveplex

17

如果您要初始化固定数组的预先初始化的equal(非null或非default)元素,请使用以下命令:

var array = Enumerable.Repeat(string.Empty, 37).ToArray();

也请参加讨论。


13

创建自定义类数组的示例

下面是类的定义。

public class DummyUser
{
    public string email { get; set; }
    public string language { get; set; }
}

这是初始化数组的方法:

private DummyUser[] arrDummyUser = new DummyUser[]
{
    new DummyUser{
       email = "abc.xyz@email.com",
       language = "English"
    },
    new DummyUser{
       email = "def@email.com",
       language = "Spanish"
    }
};


6
int[] array = new int[4]; 
array[0] = 10;
array[1] = 20;
array[2] = 30;

要么

string[] week = new string[] {"Sunday","Monday","Tuesday"};

要么

string[] array = { "Sunday" , "Monday" };

并在多维数组中

    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)"

5
嗨,示例的最后一块似乎是Visual Basic,该问题要求使用c#示例。
Alex KeySmith'3


2

创建和初始化对象数组的另一种方法。这类似于@Amol上面发布示例,除了此示例使用构造函数。一点点的多态性涌入,我无法抗拒。

IUser[] userArray = new IUser[]
{
    new DummyUser("abc@cde.edu", "Gibberish"),
    new SmartyUser("pga@lna.it", "Italian", "Engineer")
};

上下文类:

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

对于以下课程:

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;
        }
    }
}

您可以如下初始化上述对象的数组。

Pages = new Page[] { new Page("a string") };

希望这可以帮助。


0

您也可以创建动态数组,即您可以在创建数组之前先向用户询问数组的大小。

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();

0

带表达式的平凡解决方案。请注意,使用NewArrayInit只能创建一维数组。

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

0

只是一个笔记

以下数组:

string[] array = new string[2];
string[] array2 = new string[] { "A", "B" };
string[] array3 = { "A" , "B" };
string[] array4 = new[] { "A", "B" };

将被编译为:

string[] array = new string[2];
string[] array2 = new string[]
{
   "A",
   "B"
};
string[] array3 = new string[]
{
   "A",
   "B"
};
string[] array4 = new string[]
{
   "A",
   "B"
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.