Додавання значень до масиву C #


511

Напевно, це дуже просто - я починаю з 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
Не слід 'terms [] = значення;' be 'terms [] = працює;'?
tymtam

У C # ви не можете змінити розмір масиву, як тільки буде створений. Якщо ви хочете щось на зразок масивів, але зможете додати / видалити елементи, скористайтеся списком <int> ().
Kamran Bigdely

Відповіді:


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

Редагувати: а) для циклів у списку <T> трохи більше, ніж у 2 рази дешевших, ніж петлі foreach у списку <T>, б) циклічне відображення на масиві приблизно в 2 рази дешевше, ніж циклічне оновлення у списку <T>, в) циклічне включення використання масиву для в 5 разів дешевше, ніж циклічне записування в Список <T> за допомогою foreach (що робить більшість із нас).


1
Яка перевага використання списку в цьому сценарії?
Філл Хелі

9
@PhillHealey Вам не потрібно "знати", яким може бути масив, перш ніж його створити. Як бачимо, у цих прикладах ОП має ввести значення у "new int [400]" - але зі списком він цього не повинен робити.
Хейнер

3
Не був би перший біт коду нічого, оскільки значення ніде не визначено. -_-
EasyBB

1
Чому ви говорите, що ARRAY потрібно мати розмір ??? просто роби new int[]{}!!!!!
Т.Тодуа

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

85

Якщо ви пишете на C # 3, ви можете зробити це за допомогою одного вкладиша:

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

Цей фрагмент коду передбачає, що у верхній частині файлу у вас є директива використання System.Linq.

З іншого боку, якщо ви шукаєте те, що можна динамічно змінити розмір, як це здається, це стосується PHP (я ніколи насправді цього не дізнався), тоді ви можете скористатися списком замість int [] . Ось як виглядатиме цей код:

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

Зауважте, що ви не можете просто додати 401-й елемент, встановивши значення [400] до значення. Натомість вам потрібно зателефонувати Add (), наприклад:

terms.Add(1337);

65

Використання Linq метод «S 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);
}

для отримання елемента списку: 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 рази.


2
Було б набагато краще, продумавши ефективність, створити список, заповнити його, а потім виконати цю копію для масиву в кінці, щоб ви не створювали та копіювали масив у понад 400 разів
KinSlayerUY

10

Виходячи з відповіді 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;
    }

Це дозволяє додати до масиву більше, ніж один елемент, або просто передати масив як параметр для об'єднання двох масивів.


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;

}

Так би я кодував це.


3

Масиви C # мають фіксовану довжину і завжди індексуються. Перейдіть з рішенням Мотті:

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

Зауважте, що цей масив - це щільний масив, суміжний блок у 400 байт, куди ви можете скидати речі. Якщо ви хочете масив динамічного розміру, використовуйте Список <int>.

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

Ні int [], ні List <int> не є асоціативним масивом - це був би Словник <> у 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

2

Ви не можете просто додати елемент до масиву легко. Ви можете встановити елемент у заданому положенні як позначений pad888 , але я рекомендую використовувати замість нього List<int>або 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


1

Просто інший підхід:

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

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

return scorecard.Split("!");

3
Незважаючи на нове, це виконує багато об'єднання рядків, а потім виконує велику операцію перерахування! Не найефективніший або легко зрозумілий / читабельний спосіб цього зробити.
BradleyDotNET

@Ali Humayun Ви дійсно мали намір використовувати оператор присвоєння =замість оператора порівняння? Ви можете залишити змінну боротьби і використовувати runs < 400для керування циклом.
Стів

щойно практикуючи програмування подвійного ентера,
Алі Хумаюн

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

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

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

Виведення масиву значень містить:

один

два

три

чотири

п’ять

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.