Добавление значений в массив C # - PullRequest
440 голосов
/ 15 октября 2008

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

int[] terms;

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

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

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

Ответы [ 18 ]

734 голосов
/ 15 октября 2008

Вы можете сделать это так -

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) для циклов в списке чуть более чем в 2 раза дешевле, чем foreach циклов в списке , б) зацикливание на массиве примерно в 2 раза дешевле, чем зацикливание в списке , в) зацикливание на массиве с использованием для в 5 раз дешевле, чем зацикливание на списке с использованием foreach (что большинство из нас).

82 голосов
/ 15 октября 2008

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

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

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

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

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

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

terms.Add(1337);
44 голосов
/ 04 апреля 2017

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

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

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

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

36 голосов
/ 15 октября 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);
}
11 голосов
/ 21 июля 2015

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

Наиболее эффективный метод - это выделение нового массива с последующим использованием 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;
}

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

10 голосов
/ 11 сентября 2015

Основано на ответе Фракса (мне не хватает очков, чтобы ответить):

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

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

8 голосов
/ 15 октября 2008

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

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;
}
5 голосов
/ 15 октября 2008
int ArraySize = 400;

int[] terms = new int[ArraySize];


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

    terms[runs] = runs;

}

Так бы я и написал.

4 голосов
/ 15 октября 2008

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

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

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

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

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

3 голосов
/ 17 сентября 2014

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

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

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

return scorecard.Split("!");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...