Динамический массив в C #


112

Есть ли способ создания динамического массива на C #?


1
Если вы все еще застряли в старой грязи, используя [] вместо List <>, вы можете использовать Array.Resize (). Вот хороший пример. dotnetperls.com/array-resize
— Джиан

Ссылка dotnetperls.com/array-resize не работает. (FYI)
— Су Ллевеллин

Ответы:


150

Взгляните на общие списки .


13
Вопрос (хотя и короткий и непонятный) касается не общего списка - вопрос может быть dynamic[] задан о msdn.microsoft.com/en-GB/library/dd264736.aspx (массив динамических типов) или ExpandoObject msdn.microsoft.com/ en-us / library /… Я мог бы -1 ответ за то, что не упомянул об этом
— Люк Т О'Брайен

6
@ LukeTO'Brien, динамика была представлена ​​в C # 4.0, который был выпущен через год после того, как этот вопрос был первоначально задан. OP, вероятно, спрашивал о структуре данных с изменяемым размером, такой как en.wikipedia.org/wiki/Dynamic_array
— Брайан Меррелл

6
Ответы, состоящие только из ссылок на статьи, бесполезны. Нет гарантии, что ссылка останется активной.
— JamEngulfer

@JamEngulfer Это неправда. Если бы его текст ссылки был «Посмотрите на это» со ссылкой «это», я бы с вами согласился. Если вы удалите ссылку и посмотрите, что осталось, ответ OP на «взгляните на общие списки» - это много информации, чтобы любой будущий читатель начал гуглить ....
— Линн Крамблинг,

88

Расширение ответа Криса и Мигола образцом кода.

Использование массива

Student[] array = new Student[2];
array[0] = new Student("bob");
array[1] = new Student("joe");

Использование общего списка. Под капотом класс List <T> использует массив для хранения, но делает это таким образом, чтобы он мог эффективно расти.

List<Student> list = new List<Student>();
list.Add(new Student("bob"));
list.Add(new Student("joe"));
Student joe = list[1];

2
этот пример наполовину плох, потому что мы оба говорили об ArrayList
— Migol

21
Этот ответ лучше, чем ваш @Migol, потому что он показывает, как на самом деле использовать List <> вместо того, чтобы просто упоминать его как ключевое слово. «наполовину плохо» -> «наполовину хорошо» -> хорошо
— fhugas

56

Иногда простые массивы предпочтительнее общих списков, поскольку они более удобны (лучшая производительность для дорогостоящих вычислений - например, для приложений числовой алгебры или для обмена данными с программным обеспечением для статистики, таким как R или Matlab)

В этом случае вы можете использовать метод ToArray () после динамического запуска списка.

List<string> list = new List<string>();
list.Add("one");
list.Add("two");
list.Add("three");

string[] array = list.ToArray();

Конечно, это имеет смысл только в том случае, если размер массива никогда не известен и не фиксирован заранее . если вы уже знаете размер вашего массива в какой-то момент программы, лучше запустить его как массив фиксированной длины. (Если вы, например, извлекаете данные из ResultSet, вы можете подсчитать его размер и динамически инициировать массив этого размера)


1
Не стоит, если вы используете индексатор.
— aaimnr

2
Arary не более удобны (они предлагают подмножество интерфейса List <T>) и предлагают почти такую ​​же производительность, поскольку List <T> использует обычный массив внизу. Итерация для 6000000 элементов: List / for: 1971ms Array / for: 1864ms (Benchmark from stackoverflow.com/questions/454916/… )
— aaimnr

9
Если вам нужно передать массив в интерфейс, тогда это должен быть массив. Намного проще создать список, а затем преобразовать его в массив непосредственно перед тем, как передать его. Мне этот ответ нравится больше, чем другие, потому что он касается самого вопроса!
— Майкл Стимсон

36

List<T>для строго типизированного, или ArrayListесли у вас есть .NET 1.1 или вы любите приводить переменные.


2

Пример динамического массива:

Console.WriteLine("Define Array Size? ");
int number = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Enter numbers:\n");
int[] arr = new int[number];

for (int i = 0; i < number; i++)
{
    arr[i] = Convert.ToInt32(Console.ReadLine());
}
for (int i = 0; i < arr.Length; i++ )
{
    Console.WriteLine("Array Index: "+i + " AND Array Item: " + arr[i].ToString());
}
Console.ReadKey();

2

Вы можете сделать это с помощью динамических объектов:

var dynamicKeyValueArray = new[] { new {Key = "K1", Value = 10}, new {Key = "K2", Value = 5} };

foreach(var keyvalue in dynamicKeyValueArray)
{
    Console.Log(keyvalue.Key);
    Console.Log(keyvalue.Value);
}

1

Используйте список массивов, который фактически является массивом реализации. Первоначально он принимает массив размера 4, и когда он заполняется, создается новый массив с его двойным размером, и данные первого массива копируются во второй массив, теперь новый элемент вставляется в новый массив. Также имя второго массива создает псевдоним первого, так что к нему можно получить доступ по тому же имени, что и предыдущий, и первый массив удаляется


1

вы можете использовать объект arrayylist из класса коллекций

using system.collections;
   static void main()
        {
        Arrylist arr=new Arrylist();
         }

когда вы хотите добавить элемент, вы можете использовать

arr.add();

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.