2008-10-14 17 views
351

Probablemente uno muy sencillo este - Estoy empezando a cabo con C# y necesita agregar valores a una matriz, por ejemplo:Adición de valores a una C# matriz

int[] terms; 

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

Para aquellos que han utilizado PHP, aquí está lo que estoy tratando de hacer en C#:

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

En caso de que no 'términos [] = Valor;' be 'terms [] = runs;'? – mayu

Respuesta

608

Usted puede hacer de esta manera -

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

Como alternativa, puede usar listas - la ventaja de ser listas, no es necesario conocer el tamaño de la matriz cuando una instancia de la lista.

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

Editar: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

¿Cuál es la ventaja de usar una lista en este escenario? –

+5

@PhillHealey No tiene que "saber" cuán grande podría llegar a ser la matriz, antes de crearla. Como puede ver, en estos ejemplos, OP tiene que poner un valor en "new int [400]" - pero con la lista, no tiene que hacerlo. – Hejner

+0

debe tener cuidado aquí, ya que una lista solo está haciendo una expansión de matriz dinámica bajo las cubiertas sería bueno saber al menos la capacidad. –

8

Usted tiene que asignar la matriz primero:

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; 

} 

Así sería como lo codificaría.

2

No puede simplemente agregar un elemento a una matriz fácilmente. Puede configurar el elemento en una posición determinada como fallen888, pero recomiendo usar un List<int> o un Collection<int> en su lugar, y use ToArray() si lo necesita convertido a una matriz.

3

arrays de C# son de longitud fija y siempre indexados. Ir con la solución de Motti:

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

Tenga en cuenta que esta matriz es una matriz densa, un bloque contiguo de 400 bytes donde se puede dejar caer las cosas. Si desea una matriz de tamaño dinámico, use una lista < int>.

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

Ni int [] ni < Lista int> es una matriz asociativa - que sería un diccionario <> en C#. Ambas matrices y listas son densas.

32

Aquí se proporcionan respuestas sobre cómo hacerlo usando una matriz.

Sin embargo, C# tiene una cosa llamada muy útiles System.Collections :)

Colecciones de fantasía son alternativas a la utilización de una matriz, aunque muchos de ellos utilizan un conjunto internamente.

Por ejemplo, C# tiene una colección llamada Lista que funciona de forma muy similar a la matriz de 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

para recuperar un elemento de lista: int a = list [i]; – Behzad

69

Si va a escribir en C# 3, puede hacerlo con una sola línea:

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

Este fragmento de código se supone que tiene una directiva using para System.Linq en la parte superior de tu archivo.

Por otro lado, si está buscando algo que se pueda redimensionar dinámicamente, como parece ser el caso de PHP (nunca lo he aprendido), entonces puede usar una lista en lugar de un int []. Esto es lo que que código se vería así:

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

Tenga en cuenta, sin embargo, que no se puede simplemente añadir un elemento 401a por términos de ajuste [400] a un valor. En su lugar, había necesidad de llamar Agregar(), así:

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

/* Salida:

valor en el índice 0: 400
Valor del índice de 1: 400
Valor en el índice 2: 400
Valor en el índice 3: 400
Valor en el índice 4: 400
Valor en el índice 5: 400 Valor del índice de 6: 400
Valor en el índice 7: 400
Valor del índice de 8: 400
Valor del índice de 9: 400
*/

+0

¿Podría explicar esta solución? –

+0

Rune, acabo de incluir el comentario dentro del código fuente> Espero que pueda responder a su pregunta. – 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("!"); 

// Solo un enfoque diferente

+2

Aunque es un poco novedoso, esto realiza un * lote * de concatenación de cadenas y luego realiza una gran operación de enumeración. No es la forma más efectiva, fácil de entender y leer de esto. – BradleyDotNET

+0

@ Ali Humayun, ¿realmente tenía la intención de utilizar el operador de asignación '=' en lugar del operador de comparación?Puede omitir la variable de combate y usar 'runs <400' para controlar el ciclo. – Steve

+0

solo practicando programación doble sentido –

1

Si realmente necesita una matriz, la siguiente es probablemente la más 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 no conoce el tamaño de la matriz o ya tiene una matriz existente que está agregando. Puedes hacer esto de dos maneras. El primero es usar un genérico List<T>: Para hacer esto, querrá convertir el array a var termsList = terms.ToList(); y usar el método Add. Luego, cuando termine, use el método var terms = termsList.ToArray(); para convertir nuevamente a una matriz.

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 segunda forma es cambiar el tamaño de la matriz actual:

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 está utilizando .NET 3.5 Array.Add(...);

Ambos le permitirá hacerlo de forma dinámica. Si va a agregar muchos elementos, simplemente use List<T>. Si solo se trata de un par de elementos, tendrá un mejor rendimiento al redimensionar la matriz. Esto se debe a que recibe más de un golpe por crear el objeto List<T>.

tiemposen las garrapatas:

3 artículos

Matriz Tiempo de cambio de tamaño: 6

Lista Añadir Tiempo: 16

400 artículos

Matriz Tiempo de cambio de tamaño: 305

Lista Añadir Tiempo: 20

6

mediante una lista como intermediario es la forma más fácil, como han descrito otros, pero desde su entrada es una matriz y no solo desea mantener los datos en una lista, supongo que puede estar preocupado por el rendimiento.

Es probable que el método más eficiente sea asignar una nueva matriz y luego usar Array.Copy o Array.CopyTo. Esto no es difícil si lo que desea añadir un elemento al final de la lista:

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

También puedo publicar código para un método de extensión de inserción que tiene un índice de destino como entrada, si lo desea. Es un poco más complicado y usa el método estático Array.Copia 1-2 veces.

4

Sobre la base de la respuesta de Thracx (no tengo puntos suficientes para responder):

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

Esto permite añadir más de un elemento de la matriz, o simplemente pasar un array como parámetro para unir dos arreglos.

11

manera muy simple

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

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

resultado 3,4,2

Cuestiones relacionadas