Усі можливі синтаксиси ініціалізації масиву


Відповіді:


778

Це поточні методи декларування та ініціалізації для простого масиву.

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[]ліворуч на 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
З цікавості, хтось може пояснити, чому вираз ініціалізації у 3-му рядку не може бути використаний сам (наприклад, переданий у метод) або присвоєний varзмінній?
— Рубен9922

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)!
— Джефрі Л Уітлідж

17
@ Джефрі: Якщо ми йдемо цією дорогою, вона починає дуріти. Наприклад, "1,2,3,4".split(',').
— Брайан

11
Тоді для багатовимірних масивів, існує «вкладена» нотація подобається new int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };, і так далі для int[,,], int[,,,]...
— Jeppe Стіг Нільсен

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

Чи наведені приклади завершені? Чи є ще якийсь випадок?
— Програміст, орієнтований на гроші,

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

Буде створено масив порожніх рядків, повторених "count" разів. У випадку, якщо ви хочете ініціалізувати масив з тим же, але спеціальним значенням елемента за замовчуванням. Обережно з еталонними типами всі елементи будуть посилатися на один і той же об’єкт.


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

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

Як ви повинні використовувати цю структуру? Це як словник?
— Р. Навега

1
@ R.Navega це звичайний масив :)
— grooveplex

17

Якщо ви хочете ініціалізувати фіксований масив попередньо ініціалізованих рівних (не- 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 # приклади.
— Алекс Кейсміт


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"
};
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.