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

时间:2011-04-15 14:27:05

标签: c# arrays syntax array-initialization

C#可以使用的所有数组初始化语法是什么?

16 个答案:

答案 0 :(得分:641)

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

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

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

另请注意,在上面的声明中,前两个可以用string[](C#3+)替换左侧的var,因为右边的信息足以推断出正确的类型。必须按显示的方式编写第三行,因为单独的数组初始化语法不足以满足编译器的要求。第四个也可以使用推理。因此,如果你是整个简洁的事情,上面的内容可以写成

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 :(得分:411)

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节“阵列创建表达式”。

答案 2 :(得分:98)

非空数组

  • 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({})不可编辑

答案 3 :(得分:43)

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

将创建重复'count'次的空字符串数组。如果您想使用相同但特殊的默认元素值初始化数组。注意引用类型,所有元素都将引用相同的对象。

答案 4 :(得分:17)

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

答案 5 :(得分:14)

如果您想要初始化一个预先初始化的相等(非null或其他default)元素的固定数组,请使用:

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

另请参加this讨论。

答案 6 :(得分:12)

创建自定义类

数组的示例

以下是课程定义。

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

答案 7 :(得分: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)"

答案 8 :(得分:6)

重复没有LINQ

float[] floats = System.Array.ConvertAll(new float[16], v => 1.0f);

答案 9 :(得分:3)

For Class initialization:
var page1 = new Class1();
var page2 = new Class2();
var pages = new UIViewController[] { page1, page2 };

答案 10 :(得分:2)

创建和初始化对象数组的另一种方法。这类似于example which @Amol has posted above,除了这个使用构造函数。洒下了一些多态,我无法抗拒。

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

答案 11 :(得分:2)

只是笔记

以下数组:

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

答案 12 :(得分: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") };

希望这会有所帮助。

答案 13 :(得分: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();

答案 14 :(得分: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

答案 15 :(得分:0)

您好,只需添加另一种方法: 从此页面: https://docs.microsoft.com/it-it/dotnet/api/system.linq.enumerable.range?view=netcore-3.1

您可以使用此格式如果要在指定范围0到9的范围内生成整数序列:

using System.Linq
.....
public int[] arrayName = Enumerable.Range(0, 9).ToArray();