Добавление значений в массив C #

Наверное, очень простой - я начинаю с C # и мне нужно добавить значения в массив, например:

int[] terms;

for(int runs = 0; runs < 400; runs++)
{
    terms[] = runs;
}

Для тех, кто использовал PHP, вот что я пытаюсь сделать на C #:

$arr = array();
for ($i = 0; $i < 10; $i++) {
    $arr[] = $i;
}

person Ross    schedule 14.10.2008    source источник
comment
Не должно быть 'terms [] = value;' быть 'terms [] = работает;'?   -  person tymtam    schedule 07.02.2013
comment
В C # вы не можете изменить размер массива после его создания. Если вы хотите что-то вроде массивов, но у вас есть возможность добавлять / удалять элементы, используйте List ‹int› ().   -  person Kamran Bigdely    schedule 18.07.2019
comment
@KamranBigdely не так, вы можете использовать массив как IList ‹› и переназначить значение с помощью LinQ (используя System.Linq): terms = terms.Append (21) .ToArray ();   -  person Leandro Bardelli    schedule 16.10.2020
comment
@Leandro: вы фактически создаете новый массив каждый раз, когда запускаете его - ›terms = terms.Append (21) .ToArray ();   -  person Kamran Bigdely    schedule 19.10.2020
comment
да и уничтожить в назначении, и что?   -  person Leandro Bardelli    schedule 20.10.2020


Ответы (22)


Можно так сделать -

int[] terms = new int[400];
for (int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}

В качестве альтернативы вы можете использовать списки - преимущество списков в том, что вам не нужно знать размер массива при создании экземпляра списка.

List<int> termsList = new List<int>();
for (int runs = 0; runs < 400; runs++)
{
    termsList.Add(value);
}

// You can convert it back to an array if you would like to
int[] terms = termsList.ToArray();

Изменить: а) циклы for в списке ‹T> немного больше, чем В 2 раза дешевле, чем цикл foreach в List ‹T>, б) Цикл в массиве примерно в 2 раза дешевле, чем цикл в List ‹T>, в) цикл в массиве с использованием for в 5 раз дешевле, чем цикл по List ‹T> с использованием foreach (что большинство из нас и делает).

person Tamas Czinege    schedule 14.10.2008
comment
В чем преимущество использования списка в этом сценарии? - person Phill Healey; 17.02.2014
comment
@PhillHealey Вам не нужно знать, насколько большим может стать массив, прежде чем вы его создадите. Как вы можете видеть, в этих примерах OP должен поместить значение в новый int [400] - но со списком он не обязан этого делать. - person Hejner; 05.03.2014
comment
вам нужно быть осторожным, так как список просто выполняет динамическое расширение массива под крышками, было бы хорошо, по крайней мере, знать емкость. - person krystan honour; 05.08.2015
comment
Разве первый бит кода не был бы ничем, поскольку значение нигде не определено. -_- - person EasyBB; 10.09.2015
comment
Имеют ли списки C # List непрерывную память или они используют связанные элементы? - person Kapichu; 07.07.2017
comment
Почему вы говорите, что ARRAY должен иметь размер ??? вобще new int[]{} !!!!! - person T.Todua; 08.10.2017
comment
@Kapichu C # List<> является смежным. Дело в том, что основная структура данных List<> - это не что иное, как массив, а массивы смежны. Возможно, вы захотите прочитать это - Структуры данных .NET: ArrayList, List, HashTable, Dictionary, SortedList, SortedDictionary - Speed, memory, and when использовать каждый? - person RBT; 25.04.2018
comment
@ T.Todua, если вы создадите пустой массив, как вы предлагаете, а затем попытаетесь получить доступ к его несуществующим индексам для установки значений, вы получите OutOfRangeException, как только запустите код. Массивы должны быть инициализированы с размером, который вы собираетесь использовать, они резервируют все пространство в начале, что делает их очень быстрыми, но невозможно изменить их размер. - person KinSlayerUY; 07.09.2018
comment
к 2019 году вы можете использовать terms = terms.Append (21) .ToArray (); с использованием linQ - person Leandro Bardelli; 02.04.2021
comment
Я бы создал список и преобразовал его в массив. var listOfArray = llistOfData.ToArray (); - person Shammie; 23.04.2021

Использование метода Linq Concat упрощает

int[] array = new int[] { 3, 4 };

array = array.Concat(new int[] { 2 }).ToArray();

результат 3,4,2

person Yitzhak Weinberg    schedule 04.04.2017
comment
Метод заставит добавление 400 элементов в массив создать копию массива с еще одним пробелом и перемещать все элементы в новый массив 400 сотен раз. так что не рекомендуется с точки зрения производительности. - person KinSlayerUY; 07.09.2018

Если вы пишете на C # 3, вы можете сделать это с помощью однострочника:

int[] terms = Enumerable.Range(0, 400).ToArray();

Этот фрагмент кода предполагает, что у вас есть директива using для System.Linq в верхней части файла.

С другой стороны, если вы ищете что-то, размер которого можно динамически изменять, как, похоже, в случае с PHP (я никогда не изучал его), тогда вы можете использовать List вместо int [] . Вот как будет выглядеть этот код:

List<int> terms = Enumerable.Range(0, 400).ToList();

Обратите внимание, однако, что вы не можете просто добавить 401-й элемент, установив значение terms [400]. Вместо этого вам нужно будет вызвать Add (), например:

terms.Add(1337);
person Amanda Mitchell    schedule 15.10.2008

Здесь приведены ответы о том, как это сделать с использованием массива.

Однако в C # есть очень удобная штука под названием System.Collections :)

Коллекции - это отличная альтернатива использованию массива, хотя многие из них используют массив внутри.

Например, в C # есть коллекция под названием List, которая по своим функциям очень похожа на массив PHP.

using System.Collections.Generic;

// Create a List, and it can only contain integers.
List<int> list = new List<int>();

for (int i = 0; i < 400; i++)
{
   list.Add(i);
}
person FlySwat    schedule 14.10.2008
comment
для получения элемента списка: int a = list [i]; - person Behzad; 16.03.2013

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

Наиболее эффективным методом, вероятно, является выделение нового массива, а затем использование Array.Copy или Array.CopyTo. Это несложно, если вы просто хотите добавить элемент в конец списка:

public static T[] Add<T>(this T[] target, T item)
{
    if (target == null)
    {
        //TODO: Return null or throw ArgumentNullException;
    }
    T[] result = new T[target.Length + 1];
    target.CopyTo(result, 0);
    result[target.Length] = item;
    return result;
}

Я также могу опубликовать код для метода расширения Insert, который принимает индекс назначения в качестве входных данных, если это необходимо. Это немного сложнее и 1-2 раза использует статический метод Array.Copy.

person Thracx    schedule 21.07.2015
comment
Было бы намного лучше с точки зрения производительности создать список, заполнить его, а затем сделать эту копию в массив в конце, чтобы вы не создавали и не копировали массив более 400 раз. - person KinSlayerUY; 07.09.2018

Основываясь на ответе Thracx (у меня недостаточно очков, чтобы ответить):

public static T[] Add<T>(this T[] target, params T[] items)
    {
        // Validate the parameters
        if (target == null) {
            target = new T[] { };
        }
        if (items== null) {
            items = new T[] { };
        }

        // Join the arrays
        T[] result = new T[target.Length + items.Length];
        target.CopyTo(result, 0);
        items.CopyTo(result, target.Length);
        return result;
    }

Это позволяет добавить в массив более одного элемента или просто передать массив в качестве параметра для объединения двух массивов.

person Mark    schedule 11.09.2015

К 2019 году вы можете использовать Append, Prepend, используя LinQ всего в одной строке

using System.Linq;

а потом:

terms= terms.Append(21).ToArray();
person Leandro Bardelli    schedule 16.10.2020
comment
Как правило, лучше работать со списком ‹›, но если кто-то действительно хочет остаться с массивами, это самый простой способ! - person XouDo; 16.06.2021
comment
@XouDo на 100% согласен - person Leandro Bardelli; 16.06.2021

Сначала вам нужно выделить массив:

int [] terms = new int[400]; // allocate an array of 400 ints
for(int runs = 0; runs < terms.Length; runs++) // Use Length property rather than the 400 magic number again
{
    terms[runs] = value;
}
person Motti    schedule 14.10.2008

int ArraySize = 400;

int[] terms = new int[ArraySize];


for(int runs = 0; runs < ArraySize; runs++)
{

    terms[runs] = runs;

}

Вот как бы я это закодировал.

person JB King    schedule 14.10.2008

Массивы C # имеют фиксированную длину и всегда индексируются. Пойдите с решением Мотти:

int [] terms = new int[400];
for(int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}

Обратите внимание, что этот массив представляет собой плотный массив, непрерывный блок размером 400 байт, в который вы можете бросать вещи. Если вам нужен массив с динамическим размером, используйте List ‹int>.

List<int> terms = new List<int>();
for(int runs = 0; runs < 400; runs ++)
{
    terms.Add(runs);
}

Ни int [], ни List ‹int> не являются ассоциативными массивами - это был бы Dictionary ‹> в C #. И массивы, и списки плотные.

person Jimmy    schedule 14.10.2008

Если вам действительно нужен массив, возможно, самый простой вариант:

using System.Collections.Generic;

// Create a List, and it can only contain integers.
List<int> list = new List<int>();

for (int i = 0; i < 400; i++)
{
   list.Add(i);
}

int [] terms = list.ToArray();
person Steve    schedule 10.05.2015

один из подходов - заполнить массив через LINQ

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

string[] arrayToBeFilled;
arrayToBeFilled= arrayToBeFilled.Append("str").ToArray();

кроме того, если вы хотите заполнить массив несколькими элементами, вы можете использовать предыдущий код в цикле

//the array you want to fill values in
string[] arrayToBeFilled;
//list of values that you want to fill inside an array
List<string> listToFill = new List<string> { "a1", "a2", "a3" };
//looping through list to start filling the array

foreach (string str in listToFill){
// here are the LINQ extensions
arrayToBeFilled= arrayToBeFilled.Append(str).ToArray();
}

person Safi Habhab    schedule 06.04.2020

int[] terms = new int[10]; //create 10 empty index in array terms

//fill value = 400 for every index (run) in the array
//terms.Length is the total length of the array, it is equal to 10 in this case 
for (int run = 0; run < terms.Length; run++) 
{
    terms[run] = 400;
}

//print value from each of the index
for (int run = 0; run < terms.Length; run++)
{
    Console.WriteLine("Value in index {0}:\t{1}",run, terms[run]);
}

Console.ReadLine();

/*Выход:

Значение в индексе 0: 400
Значение в индексе 1: 400
Значение в индексе 2: 400
Значение в индексе 3: 400
Значение в индексе 4: 400
Значение в индексе 5: 400
Значение в индексе 6: 400
Значение в индексе 7: 400
Значение в индексе 8: 400
Значение в индексе 9: 400
* /

person jhyap    schedule 31.01.2013
comment
Не могли бы вы объяснить это решение? - person Deep Frozen; 31.01.2013
comment
Руне, я только что добавил комментарий в исходный код ›Надеюсь, он сможет ответить на ваш вопрос. - person jhyap; 01.02.2013

Вы не можете просто добавить элемент в массив. Вы можете установить элемент в заданной позиции как выделенный fallen888, но я рекомендую вместо этого использовать List<int> или Collection<int> и использовать ToArray(), если вам нужно преобразовать его в массив.

person Michael Stum    schedule 14.10.2008

Я добавлю это для другого варианта. Я больше предпочитаю этот тип функциональных строк кодирования.

Enumerable.Range(0, 400).Select(x => x).ToArray();
person David    schedule 03.06.2019

Если вы не знаете размер массива или уже имеете существующий массив, который вы добавляете. Вы можете сделать это двумя способами. Первый использует общий List<T>: для этого вам нужно преобразовать массив в var termsList = terms.ToList(); и использовать метод Add. Затем, когда это будет сделано, используйте метод var terms = termsList.ToArray(); для обратного преобразования в массив.

var terms = default(int[]);
var termsList = terms == null ? new List<int>() : terms.ToList();

for(var i = 0; i < 400; i++)
    termsList.Add(i);

terms = termsList.ToArray();

Второй способ - изменить размер текущего массива:

var terms = default(int[]);

for(var i = 0; i < 400; i++)
{
    if(terms == null)
        terms = new int[1];
    else    
        Array.Resize<int>(ref terms, terms.Length + 1);
    
    terms[terms.Length - 1] = i;
}

Если вы используете .NET 3.5 Array.Add(...);

Оба они позволят вам делать это динамически. Если вы собираетесь добавлять много элементов, просто используйте List<T>. Если это всего лишь пара элементов, то при изменении размера массива производительность будет выше. Это потому, что вы получаете больше ударов при создании объекта List<T>.

Времена в тиках:

3 предмета

Время изменения размера массива: 6

Время добавления в список: 16

400 предметов

Время изменения размера массива: 305

Время добавления списка: 20

person LCarter    schedule 18.05.2015

Просто другой подход:

int runs = 0; 
bool batting = true; 
string scorecard;

while (batting = runs < 400)
    scorecard += "!" + runs++;

return scorecard.Split("!");
person Ali Humayun    schedule 16.09.2014
comment
Хотя это немного ново, выполняется много конкатенации строк, а затем выполняется большая операция перечисления! Не самый эффективный или легко понятный / читаемый способ решения этой проблемы. - person BradleyDotNET; 17.09.2014
comment
@Ali Humayun вы действительно намеревались использовать оператор присваивания = вместо оператора сравнения? Вы можете опустить переменную battling и использовать runs < 400 для управления циклом. - person Steve; 10.05.2015
comment
просто тренируюсь в программировании, двусмысленность - person Ali Humayun; 11.05.2015

Вы не можете сделать это напрямую. Однако вы можете использовать Linq для этого:

List<int> termsLst=new List<int>();
for (int runs = 0; runs < 400; runs++)
{
    termsLst.Add(runs);
}
int[] terms = termsLst.ToArray();

Если массив terms вначале не был пустым, вы можете сначала преобразовать его в List, а затем выполнить свою работу. Нравиться:

    List<int> termsLst = terms.ToList();
    for (int runs = 0; runs < 400; runs++)
    {
        termsLst.Add(runs);
    }
    terms = termsLst.ToArray();

Примечание. Не пропустите добавление using System.Linq; в начало файла.

person Manar Gul    schedule 05.08.2020

Мне кажется, это намного проще:

var usageList = usageArray.ToList();
usageList.Add("newstuff");
usageArray = usageList.ToArray();
person Phillip Brandon Holmes    schedule 16.09.2020

Чтобы добавить значения списка в массив строк с помощью C # без использования метода ToArray ()

        List<string> list = new List<string>();
        list.Add("one");
        list.Add("two");
        list.Add("three");
        list.Add("four");
        list.Add("five");
        string[] values = new string[list.Count];//assigning the count for array
        for(int i=0;i<list.Count;i++)
        {
            values[i] = list[i].ToString();
        }

Вывод массива значений содержит:

один

два

три

четыре

пять

person Maghalakshmi Saravana    schedule 25.02.2020

Вы можете сделать это со списком. вот как

List<string> info = new List<string>();
info.Add("finally worked");

и если вам нужно вернуть этот массив, сделайте

return info.ToArray();
person jerryurenaa    schedule 20.09.2020

Пример передачи массива

public void ArrayPush<T>(ref T[] table, object value)
{
    Array.Resize(ref table, table.Length + 1); // Resizing the array for the cloned length (+-) (+1)
    table.SetValue(value, table.Length - 1); // Setting the value for the new element
}
person Mondonno    schedule 20.02.2021