Все возможные синтаксисы инициализации массива
Каковы все синтаксисы инициализации массива, которые возможны в C#?
21 ответ
Это текущие методы объявления и инициализации для простого массива.
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
(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
Синтаксисы создания массива в 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 "Выражения создания массива".
Непустые массивы
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()
Создаст массив пустых строк, повторенных "количество раз". В случае, если вы хотите инициализировать массив с тем же, но специальным значением элемента по умолчанию. Осторожно со ссылочными типами, все элементы будут ссылаться на один и тот же объект.
В случае, если вы хотите инициализировать фиксированный массив предварительно инициализированных равных (неnull
или кроме default
) элементы, используйте это:
var array = Enumerable.Repeat(string.Empty, 37).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" }
}
};
Пример создания массива пользовательского класса
Ниже приведено определение класса.
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"
}
};
Просто примечание
Следующие массивы:
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"
};
Повторите без 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 };
Привет , чтобы добавить еще один способ: с этой страницы: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();
В C# 12 вы сможете создать такой массив: int[] Positions = [1, 2, 3];
Действительно здорово!
Еще один способ создания и инициализации массива объектов. Это похоже на пример, который @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") };
Надеюсь это поможет.
Чтобы инициализировать пустой массив, он должен быть
Array.Empty<T>()
в dotnet 5.0
Для строки
var items = Array.Empty<string>();
Для номера
var items = Array.Empty<int>();
Тривиальное решение с выражениями. Обратите внимание, что с 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
Вы также можете создавать динамические массивы, т.е. вы можете сначала узнать размер массива у пользователя, прежде чем создавать его.
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();
Это текущие методы объявления и инициализации для простого массива.
string[] array = new string[3];
string[] array2 = new string[] { "1", "2" ,"3" };
string[] array3 = { "1", "2" ,"3" };
string[] array4 = new[] { "1", "2" ,"3" };
Другой способ — вызвать статическую функцию (для статического объекта) или любую функцию для объектов-экземпляров. Это можно использовать для инициализации члена.
Теперь я не тестировал все это, поэтому я поставлю то, что я тестировал (статический член и статическая функция)
Class x {
private static Option[] options = GetOptionList();
private static Option[] GetOptionList() {
return (someSourceOfData).Select(dataitem => new Option()
{field=dataitem.value,field2=dataitem.othervalue});
}
}
Я хотел бы знать, есть ли способ обойти объявление функции. Я знаю, что в этом примере ее можно использовать напрямую, но предположим, что функция немного сложнее и не может быть сведена к одному выражению.
Я представляю что-то вроде следующего (но это не работает)
Class x {
private static Option[] options = () => {
Lots of prep stuff here that means we can not just use the next line
return (someSourceOfData).Select(dataitem => new Option()
{field=dataitem.value,field2=dataitem.othervalue});
}
}
В основном способ просто объявить функцию для области заполнения переменной. Я был бы рад, если бы кто-нибудь показал мне, как это сделать.
Для многомерного массива в объявлении С# и присвоении значений.
public class Program
{
static void Main()
{
char[][] charArr = new char[][] { new char[] { 'a', 'b' }, new char[] { 'c', 'd' } };
int[][] intArr = new int[][] { new int[] { 1, 2 }, new int[] { 3, 4 } };
}
}