2008-10-14 9 views
351

Probablement un très simple cela - je commence avec C# et la nécessité d'ajouter des valeurs à un tableau, par exemple:L'ajout de valeurs à un tableau C#

int[] terms; 

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

Pour ceux qui ont utilisé PHP, voici ce que je suis en train de faire en C#:

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

Si pas 'termes [] = valeur;' être 'terms [] = runs;'? – mayu

Répondre

608

Vous pouvez le faire de cette façon -

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

Alternativement, vous pouvez utiliser des listes - l'avantage d'être des listes, vous n'avez pas besoin de connaître la taille du tableau lors de l'instanciation la liste.

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) for loops on List<T> are a bit more than 2 times cheaper than foreach loops on List<T>, b) Looping on array is around 2 times cheaper than looping on List<T>, c) looping on array using for is 5 times cheaper than looping on List<T> using foreach (which most of us do).

+0

Quel est l'avantage d'utiliser une liste dans ce scénario? –

+5

@PhillHealey Vous n'avez pas besoin de "connaître" la taille du tableau avant de le créer. Comme vous pouvez le voir, dans ces exemples, OP doit mettre une valeur dans "new int [400]" - mais avec la liste, il n'est pas obligé de le faire. – Hejner

+0

vous devez faire attention ici comme une liste est juste de faire une expansion de tableau dynamique sous les couvertures serait bon de connaître au moins la capacité. –

8

Vous devez allouer le tableau premier:

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; 
} 
0
int[] terms = new int[400]; 

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

int[] terms = new int[ArraySize]; 


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

    terms[runs] = runs; 

} 

Ce serait comment je le code.

2

Vous ne pouvez pas ajouter facilement un élément à un tableau. Vous pouvez définir l'élément à une position donnée comme suit: fallen888, mais je recommande d'utiliser un List<int> ou un Collection<int> à la place, et d'utiliser ToArray() si vous en avez besoin pour le convertir en tableau.

3

tableaux C# sont de longueur fixe et toujours indexés. Aller à la solution de Motti:

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

Notez que ce tableau est un tableau dense, un bloc contigu de 400 octets où vous pouvez déposer des choses. Si vous voulez un tableau de taille dynamique, utilisez une liste < int>.

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

Ni int [] ni Liste < int> est un tableau associatif - qui serait un dictionnaire <> en C#. Les tableaux et les listes sont denses.

32

Des réponses sur la façon de le faire en utilisant un tableau sont fournies ici.

Cependant, C# a une chose très pratique appelé System.Collections :)

Collections sont des alternatives de fantaisie à l'aide d'un tableau, bien que beaucoup d'entre eux utilisent un tableau interne. Par exemple, C# a une collection appelée List qui fonctionne très similaire au tableau 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); 
} 
+0

pour récupérer un élément de liste: int a = list [i]; – Behzad

69

Si vous écrivez en C# 3, vous pouvez le faire avec une seule ligne:

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

Cet extrait de code suppose que vous avez une directive à l'aide pour System.Linq en haut de votre fichier.D'un autre côté, si vous cherchez quelque chose qui peut être dynamiquement redimensionné, comme c'est le cas pour PHP (je ne l'ai jamais vraiment appris), alors vous pouvez utiliser une liste au lieu de un int []. Voici ce que ce code ressemblerait à ceci:

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

Notez, cependant, que vous ne pouvez pas ajouter simplement un élément 401ème par des termes de réglage [400] à une valeur. Vous auriez plutôt besoin d'appeler Ajouter(), comme ceci:

terms.Add(1337); 
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(); 

/* Sortie:

Valeur dans l'indice 0: 400
Valeur dans l'index 1: 400
La valeur de l'indice 2: 400
Valeur de l'indice 3: 400
Valeur de l'indice 4: 400
La valeur de l'indice de 5: 400
La valeur d'index 6: 400
Valeur de l'indice 7: 400
Valeur de l'indice de 8: 400
valeur d'index 9: 400
*/

+0

Pourriez-vous expliquer cette solution? –

+0

Rune, je viens d'inclure le commentaire dans le code source> J'espère qu'il pourrait répondre à votre question. – jhyap

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
 int runs = 0; bool batting = true; string scorecard; 
     while (batting = runs < 400) 
      scorecard += "!" + runs++; 
     return scorecard.Split("!"); 

// Juste une approche différente

+2

Bien que légèrement novateur, il effectue un * lot * de concaténation de chaînes, puis effectue une opération de dénombrement importante! Pas le moyen le plus performant, ou facilement compréhensible/lisible de s'y prendre. – BradleyDotNET

+0

@Ali Humayun aviez-vous vraiment l'intention d'utiliser l'opérateur d'affectation '=' au lieu de l'opérateur de comparaison?Vous pouvez omettre la variable de combat et utiliser 'runs <400> pour contrôler la boucle. – Steve

+0

juste en train de programmer un double sens –

1

Si vous avez vraiment besoin d'un tableau qui suit est probly le plus simple:

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

Si vous ne connaissez pas la taille du tableau ou si vous avez déjà un tableau existant auquel vous ajoutez. Vous pouvez y aller de deux façons. La première utilise un générique List<T>: Pour cela, vous devez convertir le tableau en var termsList = terms.ToList(); et utiliser la méthode Add. Une fois terminé, utilisez la méthode var terms = termsList.ToArray(); pour la reconvertir en tableau.

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

La deuxième façon est redimensionne le tableau actuel:

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

Si vous utilisez .NET 3.5 Array.Add(...);

Ces deux vous permettra de le faire dynamiquement. Si vous allez ajouter beaucoup d'éléments, utilisez simplement un List<T>. Si ce n'est que quelques éléments, les performances seront meilleures pour redimensionner le tableau. C'est parce que vous prenez plus d'un coup pour créer l'objet List<T>.

tempsdans les tiques:

3 articles

Tableau Redimensionner Heure: 6

Liste Ajouter Heure: 16

400 articles

Tableau Redimensionner Temps: 305

Liste Ajouter Heure: 20

6

aide d'une liste d'intermédiaire est le moyen le plus facile, comme d'autres l'ont décrit, mais depuis votre entrée est un tableau et vous ne voulez pas seulement garder les données dans une liste, je présume que vous pourriez être préoccupé par les performances.

La méthode la plus efficace consiste probablement à allouer un nouveau tableau, puis à utiliser Array.Copy ou Array.CopyTo. Ce n'est pas difficile si vous voulez juste ajouter un élément à la fin de la liste:

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

Je peux aussi poster code pour une méthode d'extension d'insertion qui prend un index de destination en entrée, si on le souhaite. C'est un peu plus compliqué et utilise la méthode statique Array.Copy 1-2 fois.

4

Sur la base de la réponse de Thracx (je n'ai pas assez de points pour répondre):

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

Cela permet d'ajouter plus d'un seul élément au tableau, ou tout simplement passer un tableau en tant que paramètre pour rejoindre deux tableaux.

11

très moyen simple

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

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

résultat 3,4,2

Questions connexes