Добавление значений в массив 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;
}

Не должно быть "terms [] = value;" быть 'terms [] = работает;'?

tymtam 07.02.2013 05:28

В C# вы не можете изменить размер массива после его создания. Если вы хотите что-то вроде массивов, но можете добавлять / удалять элементы, используйте List <int> ().

Kamran Bigdely 18.07.2019 20:17

@KamranBigdely не совсем так, вы можете использовать массив как IList <> и переназначить значение с помощью LinQ (используя System.Linq): terms = terms.Append (21) .ToArray ();

Leandro 16.10.2020 13:53

@Leandro: вы фактически создаете новый массив каждый раз, когда запускаете его -> terms = terms.Append (21) .ToArray ();

Kamran Bigdely 19.10.2020 21:19

да и уничтожить в назначении, и что?

Leandro 20.10.2020 20:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
573
5
1 829 299
25
Перейти к ответу Данный вопрос помечен как решенный

Ответы 25

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

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;
}

int[] terms = new int[400];

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

int ArraySize = 400;

int[] terms = new int[ArraySize];


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

    terms[runs] = runs;

}

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

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

Ответ принят как подходящий

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

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();

Редактировать:a) Циклы для в List <T> чуть более чем в 2 раза дешевле, чем циклы для каждого в List <T>, б) Цикл по массиву примерно в 2 раза дешевле, чем цикл по List <T>, в) Цикл по массиву с использованием для в 5 раз дешевле, чем цикл по List <T> с использованием для каждого (что большинство из нас делает).

В чем преимущество использования списка в этом сценарии?

Phill Healey 17.02.2014 15:10

@PhillHealey Вам не нужно «знать», насколько большим может стать массив, прежде чем создавать его. Как вы можете видеть, в этих примерах OP должен поместить значение в «new int [400]», но со списком он не обязан этого делать.

Hejner 05.03.2014 17:09

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

krystan honour 05.08.2015 11:12

Разве первый бит кода не был бы ничем, поскольку значение нигде не определено. -_-

EasyBB 10.09.2015 06:47

Имеют ли списки C# List <> базовую непрерывную память или они используют связанные элементы?

Kapichu 07.07.2017 23:50

Почему вы говорите, что ARRAY должен иметь размер ??? вобще new int[]{} !!!!!

T.Todua 08.10.2017 14:30

@Kapichu C# List<> является смежным. Дело в том, что основная структура данных List<> - это не что иное, как массив, а массивы непрерывны. Вы можете прочитать это - Структуры данных .NET: ArrayList, List, HashTable, Dictionary, SortedList, SortedDictionary - скорость, память и когда их использовать?

RBT 25.04.2018 11:40

@ T.Todua, если вы создадите пустой массив, как вы предлагаете, а затем попытаетесь получить доступ к его несуществующим индексам для установки значений, вы получите OutOfRangeException, как только запустите код. Массивы должны быть инициализированы с размером, который вы собираетесь использовать, они резервируют все пространство в начале, что делает их очень быстрыми, но невозможно изменить их размер.

KinSlayerUY 07.09.2018 17:25

Массивы 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#. И массивы, и списки плотные.

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

Однако в 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);
}

для получения элемента списка: int a = list [i];

Behzad 16.03.2013 13:45

Если вы пишете на 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);

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();

/*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
*/

Не могли бы вы объяснить это решение?

Deep Frozen 31.01.2013 12:15

Руне, я только что добавил комментарий в исходный код> Надеюсь, он сможет ответить на ваш вопрос.

jhyap 01.02.2013 03:58

         static void Main(string[] args)
        {
            int[] arrayname = new int[5];/*arrayname is an array of 5 integer [5] mean in array [0],[1],[2],[3],[4],[5] because array starts with zero*/
            int i, j;


          /*initialize elements of array arrayname*/
            for (i = 0; i < 5; i++)
            {
                arrayname[i] = i + 100;
            }

             /*output each array element value*/
            for (j = 0; j < 5; j++)
            {
                Console.WriteLine("Element and output value [{0}] = {1}",j,arrayname[j]);
            }
            Console.ReadKey();/*Obtains the next character or function key pressed by the user.
                                The pressed key is displayed in the console window.*/
        }

            /*arrayname is an array of 5 integer*/
            int[] arrayname = new int[5];
            int i, j;
            /*initialize elements of array arrayname*/
            for (i = 0; i < 5; i++)
            {
                arrayname[i] = i + 100;
            }

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

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

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

return scorecard.Split("!");

Хотя это немного ново, это выполнение много конкатенации строк, а затем выполнение большой операции перечисления! Не самый эффективный или легко понятный / читаемый способ решения этой проблемы.

BradleyDotNET 17.09.2014 03:47

@Ali Humayun вы действительно намеревались использовать оператор присваивания = вместо оператора сравнения? Вы можете опустить переменную battling и использовать runs < 400 для управления циклом.

Steve 10.05.2015 06:10

просто тренируюсь в программировании, двусмысленность

Ali Humayun 11.05.2015 20:51

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

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();

Если вы не знаете размер массива или уже имеете существующий массив, который вы добавляете. Вы можете сделать это двумя способами. Первый использует общий 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 шт.

Array Resize Time: 6

List Add Time: 16

400 экспонатов

Array Resize Time: 305

List Add Time: 20

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

Наиболее эффективным методом, вероятно, является выделение нового массива, а затем использование 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.

Было бы намного лучше с точки зрения производительности создать список, заполнить его, а затем сделать эту копию в массив в конце, чтобы вы не создавали и не копировали массив более 400 раз.

KinSlayerUY 07.09.2018 17:30

Основываясь на ответе 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;
    }

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

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

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

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

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

Метод заставит добавить 400 элементов в массив, создать копию массива с еще одним пробелом и переместить все элементы в новый массив 400 сотен раз. так что не рекомендуется с точки зрения производительности.

KinSlayerUY 07.09.2018 17:28

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

Enumerable.Range(0, 400).Select(x => x).ToArray();

Чтобы добавить значения списка в массив строк с помощью 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();
        }

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

один

два

три

четыре

5

один из подходов - заполнить массив через 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();
}

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

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

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

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

Note: don't miss adding 'using System.Linq;' at the begaining of the file.

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

var usageList = usageArray.ToList();
usageList.Add("newstuff");
usageArray = usageList.ToArray();

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

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

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

return info.ToArray();

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

using System.Linq;

а потом:

terms= terms.Append(21).ToArray();

Я думаю, что это лучший способ сделать это
Пример отправки массива

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
}

Другие вопросы по теме