Как добавить числа в массив c

от admin

Добавить новые элементы в массив в C#

В этом посте мы обсудим, как добавить новые элементы в массив в C#.

Поскольку мы не можем изменить размер массива после его создания в C#, нет прямого способа изменить размер массива фиксированного размера для размещения дополнительных элементов.

Если нам нужна реализация на основе массива с изменяемым размером, рекомендуемым решением является использование List . По мере добавления элементов в List , его емкость автоматически увеличивается. Но если вы настаиваете на использовании массивов, вам нужно создать экземпляр нового массива для размещения дополнительного элемента. Мы можем сделать это любым из следующих способов:

Add Or Append Item To An Array C#

Adding element to array means to add a new item or an element of type to an existing array.

In C#, we have a few different options to add or append to an existing array.

Let’s see all of these with examples.

Add To Array Using Array.Append() Method C#

The .Append() method on the array appends a value to the end of the sequence.

Append (this IEnumerable source, TSource element)

The Array.Append() method returns a new sequence that ends with element.

Array.Append() Method — Code Example

// New String Array with a few default values string[] colorsArray = new string[] < "Red", "Blue" >; // Using the .Append() method and converting it back to a string array colorsArray = colorsArray.Append(«Yellow»).ToArray(); // Display values foreach (var item in colorsArray)

Red Blue Yellow

Add Element To Array Using Array.Resize() Method C#

Using the .Resize() method on the array, we can resize the size of the array. We can resize the original array to a bigger size so that we can add or append elements to that array.

The .Resize() method changes the number of elements of a one-dimensional array to the specified new size.

Resize ([NotNull] ref T[]? array, int newSize)

Array.Resize() Method — Code Example

// New String Array with a few default values string[] colorsArray = new string[] < "Red", "Blue" >; // We will resize the original array and increase the length by 1 Array.Resize(ref colorsArray, colorsArray.Length + 1); // Adding a new element by adding a new item on the last element colorsArray[colorsArray.Length — 1] = «Orange»; // Display values foreach (var item in colorsArray)

Red Blue Orange

Add Element To Array By Converting Array To List And Using List.Add() Method C#

In this example, we will first convert the array to a list and then use the .Add() method on the list to add an item to the end of the list. Then we will convert back this list to an array if required.

Как добавить числа в массив c

В этой статье вы научитесь работать с массивами: объявлять, инициализировать и получать доступ к элементам

Иллюстрация

Содержание

Объявление массива в C/C++

В программировании часто встречается задача обработки множества экземпляров однотипных данных. Представьте себе ситуацию: мы провели опрос 100 человек и узнали их возраст. Чтобы сохранить собранные данные, вы можете создать целочисленный массив, содержащий 100 элементов:

В C++ массивы статичны: вы не сможете изменить размер или тип элементов после объявления.

Доступ к элементам массива

Вы можете получать доступ к элементам массива, используя индексы и оператор [] . Допустим, вы объявили массив marks , как показано ниже. К первому элементу можно обратиться выражением marks[0] , ко второму — выражением marks[1] , и так далее. Доступ всегда начинается с единицы, а индекс последнего элемента на единицу меньше размера массива.

Иллюстрация

Инициализация массива при объявлении

Можно инициализировать массив при объявлении. Для этого надо указать в списке столько значений, сколько вмещает массив, либо одно значение 0, чтобы заполнить массив нулями:

Обход элементов массива в цикле

Узнать число элементов в массиве можно функцией std::size. Обойти можно, используя цикл по индексам либо range-based for:

Неопределённое поведение: выход за границы (out of bounds)

Выход за пределы массива является неопределённым поведением (англ. undefined behavior). Нет гарантий, как поведёт себя программа в этом случае. Высока вероятность, что вы испортите память других переменных, но эффект может различаться в разных режимах компиляции:

Передача массива как параметра функции

Массив в стиле языка C хранит только указатель на начало и не хранит свой размер, что и создаёт сложность в передаче в функцию. Размер массива известен во время компиляции, но не известен во время выполнения. Поэтому передать размер можно несколькими не очень очевидными путями:

Динамически изменяемый массив

Обычные массивы имеют неизменный размер. Вы можете ввести вспомогательную переменную, которая бы хранила число реально используемых ячеек массива. Но и в этом случае вы не сможете использовать элементов больше, чем задано при компиляции в виде размера массива.

Так мог бы выглядеть имитация динамического массива:

Класс std::vector<T>

Стандартная библиотека C++ содержит шаблонный класс vector, который работает как динамический массив произвольного размера. Размер может расти до тех пор, пока у операционной системы есть область памяти подходящего размера (вплоть до нескольких гигабайт).

Класс является шаблонным, то есть при объявлении переменной потребуется параметризовать шаблон класса vector типом элемента:

Использование вектора похоже на использование массива:

  • работает запрос элемента ages[index] , причём индексация так же начинается с нуля
  • при выходе за границы динамического массива так же возникает неопределённое поведение (англ. undefined behavior)
  • работает перебор элементов с помощью индексов, range-based for или итераторов
  • есть метод size для получения размера: ages.size()

Добавление элементов в конец массива

Для добавления существует два метода: push_back и emplace_back

  • push_back получает значение элемента и добавляет в конец
  • emplace_back работает сложнее: он получает параметры, необходимые конструктору элемента, и конструирует его прямо в конце массива

Вы можете практически всегда использовать push_back. Метод pop_back можно использовать для удаления элемента:

В документации std::vector можно прочитать о других методах.

Перемещение элементов в памяти при изменении массива

Динамический массив использует для хранения элементов динамическую память (так же известную как “куча”, англ. heap). При добавлении большого числа элементов динамический массив несколько раз перераспределяет память, поскольку выделенной ранее линейной области памяти уже не хватает для хранения всех элементов. Обычно при нехватке памяти под очередной элемент vector запрашивает новую область памяти в 1,5-2 раза больше предыдущей, перемещает в неё уже существующие элементы и добавляет в конец новый, а затем освобождает старую область памяти.

Если не сообразили, как это происходит, взгляните на картинку:

Иллюстрация

Новая область находится уже другом месте, потому что менеджер динамической памяти не мог просто взять и расширить старую область (ведь сразу за ней находилась чужая память). Поэтому все итераторы, ссылки и указатели на элементы могут стать некорректными после любого изменения массива!

Читать:
Как удалить фото с сайта

Метод erase для удаления элементов из середины

Метод erase класса vector получает итератор и уничтожает элемент, на который итератор указывает:

Последствия перемещения элементов: ошибка в простом цикле с erase

Использование итератора, ссылки или указателя на элемент после перераспределения памяти в массиве является неопределённым поведением: скорее всего произойдёт падение программы либо будет пропущено несколько элементов коллекции. Это показано в примере ниже:

Если вы запустите этот код, вы можете увидеть что угодно. Скорее всего программа выведет 10 38 99 , хотя должна вывести 10 23 7 38 99 по замыслу автора.

Для решения этой проблемы метод erase возвращает новый, валидный итератор на элемент, следующий после удалённого. Если элемент был последним, erase вернёт итератор end. Учитывая это, мы можем исправить код, чтобы новое значение it либо получалось из erase, либо получалось путём инкремента:

Программа корректно напечатает 10 23 7 38 99 .

Идиома remove_if + erase

В C++ есть замечательная библиотека алгоритмов <algorithm> . В данном случае алгоритмом называют шаблон функции, способный заменить цикл в какой-то одной узкой задаче. Например, remove_if перемещает элементы, соответствующие условию, в конец массива (в “удалённую” зону), и возвращает итератор на начала “удалённой” зоны. Затем вызовом erase можно уничтожить элементы из этой зоны.

Adding values to a C# array

Probably a really simple one this — I’m starting out with C# and need to add values to an array, for example:

For those who have used PHP, here’s what I’m trying to do in C#:

26 Answers 26

You can do this way —

Alternatively, you can use Lists — the advantage with lists being, you don’t need to know the array size when instantiating the list.

Using Linq’s method Concat makes this simple

Yitzhak Weinberg's user avatar

If you’re writing in C# 3, you can do it with a one-liner:

This code snippet assumes that you have a using directive for System.Linq at the top of your file.

On the other hand, if you’re looking for something that can be dynamically resized, as it appears is the case for PHP (I’ve never actually learned it), then you may want to use a List instead of an int[]. Here’s what that code would look like:

Note, however, that you cannot simply add a 401st element by setting terms[400] to a value. You’d instead need to call Add() like this:

Leandro Bardelli's user avatar

Amanda Mitchell's user avatar

By 2019 you can use Append , Prepend using LinQ in just one line

and then in NET 6.0:

or versions lower than NET 6.0

Leandro Bardelli's user avatar

Answers on how to do it using an array are provided here.

However, C# has a very handy thing called System.Collections

Collections are fancy alternatives to using an array, though many of them use an array internally.

For example, C# has a collection called List that functions very similar to the PHP array.

Leandro Bardelli's user avatar

Using a List as an intermediary is the easiest way, as others have described, but since your input is an array and you don’t just want to keep the data in a List, I presume you might be concerned about performance.

The most efficient method is likely allocating a new array and then using Array.Copy or Array.CopyTo. This is not hard if you just want to add an item to the end of the list:

I can also post code for an Insert extension method that takes a destination index as input, if desired. It’s a little more complicated and uses the static method Array.Copy 1-2 times.

Based on the answer of Thracx (I don’t have enough points to answer):

This allows to add more than just one item to the array, or just pass an array as a parameter to join two arrays.

You have to allocate the array first:

Motti's user avatar

That would be how I’d code it.

C# arrays are fixed length and always indexed. Go with Motti’s solution:

Note that this array is a dense array, a contiguous block of 400 bytes where you can drop things. If you want a dynamically sized array, use a List<int>.

Neither int[] nor List<int> is an associative array — that would be a Dictionary<> in C#. Both arrays and lists are dense.

Peter Mortensen's user avatar

You can’t just add an element to an array easily. You can set the element at a given position as fallen888 outlined, but I recommend to use a List<int> or a Collection<int> instead, and use ToArray() if you need it converted into an array.

AlexB's user avatar

If you really need an array the following is probly the simplest:

one approach is to fill an array via LINQ

if you want to fill an array with one element you can simply write

furthermore, If you want to fill an array with multiple elements you can use the previous code in a loop

Safi Habhab's user avatar

Leandro Bardelli's user avatar

Mondonno's user avatar

/*Output:

Value in index 0: 400
Value in index 1: 400
Value in index 2: 400
Value in index 3: 400
Value in index 4: 400
Value in index 5: 400
Value in index 6: 400
Value in index 7: 400
Value in index 8: 400
Value in index 9: 400
*/

jhyap's user avatar

If you don’t know the size of the Array or already have an existing array that you are adding to. You can go about this in two ways. The first is using a generic List<T> : To do this you will want convert the array to a var termsList = terms.ToList(); and use the Add method. Then when done use the var terms = termsList.ToArray(); method to convert back to an array.

The second way is resizing the current array:

If you are using .NET 3.5 Array.Add(. );

Both of these will allow you to do it dynamically. If you will be adding lots of items then just use a List<T> . If it’s just a couple of items then it will have better performance resizing the array. This is because you take more of a hit for creating the List<T> object.

Times in ticks:

3 items

Array Resize Time: 6

List Add Time: 16

400 items

Array Resize Time: 305

List Add Time: 20

Похожие статьи