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


Відповіді:


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.