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

512

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

int[] terms;

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

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

$arr = array();
for ($i = 0; $i < 10; $i++) {
    $arr[] = $i;
}
Росс
источник
10
Не должен 'term [] = значение;' быть 'условия [] = работает;'?
тымтам
В C # вы не можете изменить размер массива после его создания. Если вы хотите что-то вроде массивов, но можете добавлять / удалять элементы, используйте List <int> ().
Камран Бигдели

Ответы:

822

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

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

Тамас Чинеге
источник
2
В чем преимущество использования списка в этом сценарии?
Фил Хили
9
@PhillHealey Вам не нужно «знать», насколько большим может стать массив, прежде чем создавать его. Как вы можете видеть, в этих примерах OP должен поместить значение в «new int [400]» - но со списком он не обязан это делать.
Хейнер
3
Не будет ли первый бит кода ничем, поскольку значение нигде не определено. -_-
EasyBB
1
Почему вы говорите, что ARRAY нужно иметь размер ??? просто делай new int[]{}!!!!!
Т.Тодуа
6
@ T.Todua, если вы создадите пустой массив, как вы предлагаете, и затем попытаетесь получить доступ к его несуществующим индексам для установки значений, вы получите, OutOfRangeExceptionкак только вы запустите код. Массивы должны быть инициализированы с размером, который вы собираетесь использовать, они резервируют все пространство в начале, что делает их очень быстрыми, но их размер не может быть изменен.
KinSlayerUY
85

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

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

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

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

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

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

terms.Add(1337);
Дэвид Митчелл
источник
65

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

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

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

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

Ицхак Вайнберг
источник
12
Метод позволит добавить 400 элементов в массив, создать копию массива с еще одним пробелом и переместить все элементы в новый массив 400 сотен раз. поэтому не рекомендуется производительность.
KinSlayerUY
39

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

Однако в 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);
}
FlySwat
источник
для получения элемента списка: int a = list [i];
Бехзад
10

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

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

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

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

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

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

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
int ArraySize = 400;

int[] terms = new int[ArraySize];


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

    terms[runs] = runs;

}

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

JB King
источник
3

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

Джимми
источник
2
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
* /

jhyap
источник
Не могли бы вы объяснить это решение?
Глубоко заморожено
Руна, я только что включил комментарий в исходный код> Надеюсь, что он может ответить на ваш вопрос.
2013 года
2

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

Майкл Стум
источник
2

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

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();
Стив
источник
2

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

Enumerable.Range(0, 400).Select(x => x).ToArray();
Дэвид
источник
1

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

LCarter
источник
1

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

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

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

return scorecard.Split("!");
Али Хумаюн
источник
3
Хотя немного романа, это выполняет много конкатенации строк , а затем выполняет большую операцию перечисления! Не самый производительный или легко понятный / читаемый способ решения этой проблемы.
BradleyDotNET
@ Али Хумаюн, ты действительно намеревался использовать оператор присваивания =вместо оператора сравнения? Вы можете оставить переменную сражения и использовать ее runs < 400для управления циклом.
Стив
просто практикую программирование double entender
Али Хумаюн
1

один из подходов - заполнить массив через 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();
}
Сафи Хабхаб
источник
0
int[] terms = new int[400];

for(int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}
Джонно Нолан
источник
0
         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.*/
        }
user3404904
источник
0
            /*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;
            }
user3404904
источник
0

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

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

один

два

три

четыре

пять

Магалакшми Саравана
источник