Aggiunta di valori a un array C #


512

Probabilmente molto semplice: sto iniziando con C # e devo aggiungere valori a un array, ad esempio:

int[] terms;

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

Per coloro che hanno usato PHP, ecco cosa sto cercando di fare in C #:

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

10
Non dovrebbe 'terms [] = value;' be 'terms [] = run;'?
Tymtam,

In C #, non è possibile modificare le dimensioni dell'array una volta creato. Se si desidera qualcosa come array ma essere in grado di aggiungere / rimuovere elementi, utilizzare Elenco <int> ().
Kamran Bigdely,

Risposte:


822

Puoi fare così -

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

In alternativa, è possibile utilizzare gli elenchi: il vantaggio di elenchi è che non è necessario conoscere le dimensioni dell'array durante l'istanza dell'elenco.

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

Edit: a) per il loop sul List <T> sono un po 'più di 2 volte in meno rispetto foreach loop sul List <T>, b) Looping su array è circa 2 volte più economico di loop su List <T>, c) loop su l'array che utilizza for è 5 volte più economico del looping sull'elenco <T> usando foreach (cosa che la maggior parte di noi fa).


2
Qual è il vantaggio di utilizzare un elenco in questo scenario?
Phill Healey,

9
@PhillHealey Non devi "sapere" quanto può diventare grande l'array prima di crearlo. Come puoi vedere, in questi esempi, OP deve inserire un valore in "new int [400]" - ma con l'elenco, non deve farlo.
Hejner

3
Il primo bit di codice non sarebbe nulla poiché il valore non è definito da nessuna parte. -_-
EasyBB

1
Perché dici che ARRAY deve avere una dimensione ??? basta new int[]{}!!!!!
T.Todua,

6
@Todua se crei un array vuoto come stai suggerendo e poi provi ad accedere ai suoi indici inesistenti per impostare i valori, otterrai uno OutOfRangeExceptionnon appena esegui il codice. Le matrici devono essere inizializzate con le dimensioni che verranno utilizzate, riservano tutto lo spazio all'inizio, la strega le rende molto veloci, ma non è possibile ridimensionarle.
KinSlayer:

85

Se stai scrivendo in C # 3, puoi farlo con una riga:

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

Questo frammento di codice presuppone che nella parte superiore del file sia presente una direttiva using per System.Linq.

D'altra parte, se stai cercando qualcosa che può essere ridimensionato dinamicamente, come sembra essere il caso di PHP (non l'ho mai realmente imparato), allora potresti voler usare un Elenco invece di un int [] . Ecco come sarebbe quel codice:

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

Si noti, tuttavia, che non è possibile semplicemente aggiungere un elemento 401st impostando i termini [400] su un valore. Dovresti invece chiamare Aggiungi (), in questo modo:

terms.Add(1337);

65

Usando il metodo di Linq Concat lo rende semplice

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

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

risultato 3,4,2


12
Il metodo consentirà di aggiungere 400 elementi all'array per creare una copia dell'array con uno spazio in più e spostare tutti gli elementi nel nuovo array, 400 volte. quindi non è consigliata la prestazione saggia.
KinSlayer:

39

Le risposte su come farlo utilizzando un array sono fornite qui.

Tuttavia, C # ha una cosa molto utile chiamata System.Collections :)

Le raccolte sono alternative fantasiose all'utilizzo di una matrice, sebbene molte di esse utilizzino una matrice internamente.

Ad esempio, C # ha una raccolta chiamata Elenco che funziona in modo molto simile all'array 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);
}

per recuperare un elemento list: int a = list [i];
Behzad,

10

L'uso di un elenco come intermediario è il modo più semplice, come altri hanno descritto, ma poiché il tuo input è un array e non vuoi solo conservare i dati in un elenco, presumo che potresti essere preoccupato per le prestazioni.

Il metodo più efficiente è probabilmente quello di allocare un nuovo array e quindi utilizzare Array.Copy o Array.CopyTo. Questo non è difficile se vuoi solo aggiungere un elemento alla fine dell'elenco:

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

Posso anche inviare codice per un metodo di estensione Inserisci che accetta un indice di destinazione come input, se lo si desidera. È un po 'più complicato e utilizza il metodo statico Array.Copy 1-2 volte.


2
Sarebbe molto meglio, dal punto di vista delle prestazioni, creare un elenco, riempirlo e quindi fare questa copia nell'array alla fine, quindi non stai creando e copiando l'array più e più di 400 volte
KinSlayerUY

10

Basato sulla risposta di Thracx (non ho abbastanza punti per rispondere):

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

Ciò consente di aggiungere più di un solo elemento all'array o semplicemente di passare un array come parametro per unire due array.


8

Devi prima allocare l'array:

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;

}

Sarebbe come lo codificherei.


3

Le matrici C # sono a lunghezza fissa e sempre indicizzate. Vai con la soluzione di Motti:

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

Si noti che questo array è un array denso, un blocco contiguo di 400 byte in cui è possibile rilasciare oggetti. Se si desidera un array di dimensioni dinamiche, utilizzare un Elenco <int>.

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

Né int [] né List <int> sono un array associativo, che sarebbe un dizionario <> in C #. Sia gli array che gli elenchi sono densi.


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

/*Produzione:

Valore nell'indice 0: 400
Valore nell'indice 1: 400
Valore nell'indice 2: 400
Valore nell'indice 3: 400
Valore nell'indice 4: 400
Valore nell'indice 5: 400
Valore nell'indice 6: 400
Valore nell'indice 7: 400
Valore in indice 8: 400
Valore nell'indice 9: 400
* /


Potresti spiegare questa soluzione?
Deep Frozen

Rune, ho appena incluso il commento nel codice sorgente> Spero che possa rispondere alla tua domanda.
jhyap,

2

Non puoi semplicemente aggiungere facilmente un elemento a un array. È possibile impostare l'elemento in una determinata posizione come indicato in fall888 , ma si consiglia di utilizzare a List<int>o a Collection<int>invece e utilizzare ToArray()se necessario, convertendolo in un array.


2

Se hai davvero bisogno di un array, probabilmente il seguente è il più semplice:

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

Lo aggiungerò per un'altra variante. Preferisco di più questo tipo di linee di codifica funzionali.

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

1

Se non si conosce la dimensione dell'array o si dispone già di un array esistente che si sta aggiungendo. Puoi farlo in due modi. Il primo utilizza un generico List<T>: per fare ciò, ti consigliamo di convertire l'array in un var termsList = terms.ToList();e utilizzare il metodo Aggiungi. Quindi, una volta terminato, utilizzare il var terms = termsList.ToArray();metodo per riconvertire in un array.

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

Il secondo modo è ridimensionare l'array corrente:

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

Se si utilizza .NET 3.5 Array.Add(...);

Entrambi ti permetteranno di farlo in modo dinamico. Se aggiungerai molti elementi, usa semplicemente a List<T>. Se si tratta solo di un paio di elementi, avrà prestazioni migliori ridimensionando l'array. Questo perché si prende più di un colpo per la creazione List<T>dell'oggetto.

Tempi in zecche:

3 elementi

Tempo di ridimensionamento array: 6

Tempo aggiunta elenco: 16

400 articoli

Tempo di ridimensionamento della matrice: 305

Tempo aggiunta elenco: 20


1

Solo un approccio diverso:

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

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

return scorecard.Split("!");

3
Anche se leggermente nuovo, questo sta eseguendo molta concatenazione di stringhe e quindi eseguendo una grande operazione di enumerazione! Non è il modo più performante, o facilmente comprensibile / leggibile di procedere.
BradleyDotNET,

@Ali Humayun avevi davvero intenzione di utilizzare l'operatore di assegnazione =anziché l'operatore di confronto? Puoi tralasciare la variabile di combattimento e usare runs < 400per controllare il loop.
Steve,

sto solo facendo pratica con il doppio senso
Ali Humayun,

1

un approccio è quello di riempire un array tramite LINQ

se vuoi riempire un array con un elemento puoi semplicemente scrivere

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

inoltre, se si desidera riempire un array con più elementi, è possibile utilizzare il codice precedente in un ciclo

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

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

Per aggiungere i valori dell'elenco all'array di stringhe utilizzando C # senza utilizzare il metodo 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();
        }

L'output dell'array di valori contiene:

uno

Due

tre

quattro

cinque

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.