Все возможные синтаксисы инициализации массива

Каковы все синтаксисы инициализации массива, которые возможны с помощью С#?

Ответ 1

Это текущая декларация и методы инициализации для простого массива.

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 (С# 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 

Ответ 2

Синтаксис создания массива в С#, который является выражением:

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

В первом случае размер может быть любым неотрицательным интегральным значением, а элементы массива инициализируются значениями по умолчанию.

Во втором случае размер должен быть константой, а количество заданных элементов должно совпадать. Должно быть неявное преобразование из заданных элементов в заданный тип элемента массива.

В третьем случае элементы должны быть неявно конвертируемыми в тип элемента, а размер определяется из числа заданных элементов.

В четвертом случае тип элемента массива определяется путем вычисления наилучшего типа, если он есть, всех данных элементов, имеющих типы. Все элементы должны быть неявно конвертируемыми в этот тип. Размер определяется из числа заданных элементов. Этот синтаксис был введен в С# 3.0.

Существует также синтаксис, который может использоваться только в объявлении:

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

Элементы должны быть неявно преобразованы в тип элемента. Размер определяется из числа заданных элементов.

нет руководства "все-в-одном"

Я отсылаю вас к спецификации С# 4.0, раздел 7.6.10.4 "Выражения создания массива".

Ответ 3

Непустые массивы

  • 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({}) не компилируется

Ответ 4

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

Создает массив пустых строк, повторяя "кол-во". Если вы хотите инициализировать массив с тем же, но специальным значением элемента по умолчанию. Осторожно со ссылочными типами, все элементы будут ссылаться на один и тот же объект.

Ответ 5

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

Ответ 6

Если вы хотите инициализировать фиксированный массив предварительно инициализированных равных (non- null или иных, чем по default) элементов, используйте это:

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

Также, пожалуйста, примите участие в этой дискуссии.

Ответ 7

Пример создания массива пользовательского класса

Ниже приведено определение класса.

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

Вот как вы можете инициализировать массив:

private DummyUser[] arrDummyUser = new DummyUser[]
{
    new DummyUser{
       email = "[email protected]",
       language = "English"
    },
    new DummyUser{
       email = "[email protected]",
       language = "Spanish"
    }
};

Ответ 8

Повторите без LINQ:

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

Ответ 9

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

Ответ 10

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

Ответ 11

Другой способ создания и инициализации массива объектов. Это похоже на пример, который @Amol опубликовал выше, за исключением того, что он использует конструкторы. Посыпалась полиция, я не мог сопротивляться.

IUser[] userArray = new IUser[]
{
    new DummyUser("[email protected]", "Gibberish"),
    new SmartyUser("[email protected]", "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;
}

Ответ 12

Вы также можете создавать динамические массивы, то есть сначала можете задать размер массива у пользователя перед его созданием.

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

Ответ 13

Тривиальное решение с выражениями. Обратите внимание, что с помощью 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