Які всі синтаксиси ініціалізації масиву можливі за допомогою C #?
Які всі синтаксиси ініціалізації масиву можливі за допомогою C #?
Відповіді:
Це поточні методи декларування та ініціалізації для простого масиву.
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
var x = {}
це не працює, якщо ініціалізатор масиву може дати щось інше, ніж масиви, але я б не знав, що це таке. Тому я думаю, що ініціалізатор масиву є мовною особливістю. Якщо ви користуєтесь ним, new List<string> {"A", "B"}
це дає і щось інше.
Синтаксиси створення масиву в 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 "Вирази створення масиву".
Array.CreateInstance(typeof(int), 3)
!
"1,2,3,4".split(',')
.
new int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };
, і так далі для int[,,]
, int[,,,]
...
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({})
не комбінуєтьсяEnumerable.Repeat(String.Empty, count).ToArray()
Буде створено масив порожніх рядків, повторених "count" разів. У випадку, якщо ви хочете ініціалізувати масив з тим же, але спеціальним значенням елемента за замовчуванням. Обережно з еталонними типами всі елементи будуть посилатися на один і той же об’єкт.
var arr1 = Enumerable.Repeat(new object(), 10).ToArray();
ви отримуєте 10 посилань на один і той же об’єкт. Для створення 10 різних об'єктів ви можете використовувати var arr2 = Enumerable.Repeat(/* dummy: */ false, 10).Select(x => new object()).ToArray();
або подібні.
var contacts = new[]
{
new
{
Name = " Eugene Zabokritski",
PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
},
new
{
Name = " Hanying Feng",
PhoneNumbers = new[] { "650-555-0199" }
}
};
Якщо ви хочете ініціалізувати фіксований масив попередньо ініціалізованих рівних (не- null
чи інших default
) елементів, скористайтеся цим:
var array = Enumerable.Repeat(string.Empty, 37).ToArray();
Також будь ласка, приймайте участь у цій дискусії.
Нижче наведено визначення класу.
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"
}
};
Повторіть без LINQ :
float[] floats = System.Array.ConvertAll(new float[16], v => 1.0f);
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)"
For Class initialization:
var page1 = new Class1();
var page2 = new Class2();
var pages = new UIViewController[] { page1, page2 };
Ще один спосіб створення та ініціалізації масиву об’єктів. Це аналогічно тому прикладу, який @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;
}
Для класу нижче:
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") };
Сподіваюсь, це допомагає.
Ви також можете створити динамічні масиви, тобто ви можете спочатку запитати розмір масиву у користувача перед його створенням.
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();
Тривіальне рішення з виразами. Зауважте, що за допомогою 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
Просто записка
Наступні масиви:
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"
};
var
змінній?