Agregar valores a una matriz de C #


512

Probablemente sea realmente simple: estoy comenzando con C # y necesito agregar valores a una matriz, por ejemplo:

int[] terms;

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

Para aquellos que han usado PHP, esto es lo que estoy tratando de hacer en C #:

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

10
No debería 'términos [] = valor;' ser 'términos [] = carreras;'?
tymtam

En C #, no puede cambiar el tamaño de la matriz una vez que se crea. Si desea algo como matrices pero puede agregar / eliminar elementos, use List <int> ().
Kamran Bigdely

Respuestas:


822

Puedes hacerlo de esta manera:

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

Alternativamente, puede usar Listas: la ventaja de las listas es que no necesita saber el tamaño de la matriz al crear instancias 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) para los bucles en la Lista <T> son un poco más de 2 veces más baratos que los bucles foreach en la Lista <T>, b) El bucle en la matriz es aproximadamente 2 veces más barato que el bucle en la Lista <T>, c) el uso de la matriz para es 5 veces más barato que el bucle en la Lista <T> usando foreach (que la mayoría de nosotros hacemos).


2
¿Cuál es la ventaja de usar una lista en este escenario?
Phill Healey

99
@PhillHealey No tiene que "saber" qué tan grande puede 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

3
El primer bit de código no sería nada ya que el valor no está definido en ninguna parte. -_-
EasyBB

1
¿Por qué dices que ARRAY necesita tener un tamaño? solo hazlo new int[]{}!!!!!
T.Todua

66
@ T.Todua si crea una matriz vacía como está sugiriendo y luego intenta acceder a sus índices inexistentes para establecer valores, obtendrá una OutOfRangeExceptiontan pronto como ejecute el código. Las matrices deben inicializarse con el tamaño que va a utilizar, reservan todo el espacio al principio, lo que hace que sean muy rápidas, pero no es posible cambiar su tamaño.
KinSlayerUY

85

Si está escribiendo en C # 3, puede hacerlo con una sola línea:

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

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

Por otro lado, si está buscando algo que se pueda cambiar de tamaño dinámicamente, como parece ser el caso de PHP (nunca lo aprendí), es posible que desee usar una Lista en lugar de un int [] . Así es como se vería ese código:

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

Sin embargo, tenga en cuenta que no puede simplemente agregar un elemento 401 estableciendo los términos [400] en un valor. En su lugar, debería llamar a Add (), así:

terms.Add(1337);

65

Usando el método de Linq , Concat hace esto simple

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

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

resultado 3,4,2


12
El método hará que agregar 400 elementos a la matriz cree una copia de la matriz con un espacio más y mover todos los elementos a la nueva matriz, 400 cientos de veces. Por lo tanto, no se recomienda el rendimiento inteligente.
KinSlayerUY

39

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

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

Las colecciones son alternativas sofisticadas al uso de una matriz, aunque muchas de ellas usan una matriz internamente.

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

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

10

Usar una Lista como intermediario es la forma más fácil, como han descrito otros, pero dado que su entrada es una matriz y no solo desea mantener los datos en una Lista, supongo que podría estar preocupado por el rendimiento.

El método más eficiente es asignar una nueva matriz y luego usar Array.Copy o Array.CopyTo. Esto no es difícil si solo desea agregar 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 Insert que toma un índice de destino como entrada, si lo deseo. Es un poco más complicado y utiliza el método estático Array. Copie 1-2 veces.


2
Sería mucho mejor, en cuanto al rendimiento, crear una lista, completarla y luego hacer esta copia en la matriz al final, para que no esté creando y copiando la matriz una y otra vez 400 veces
KinSlayerUY

10

Basado en la respuesta de Thracx (no tengo suficientes puntos 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 agregar más de un elemento a la matriz, o simplemente pasar una matriz como parámetro para unir dos matrices.


8

Primero debe asignar la matriz:

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;

}

Así sería como lo codificaría.


3

Las matrices de C # tienen una longitud fija y siempre están indexadas. Ve 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 puede soltar 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 List <int> son una matriz asociativa, eso sería un Diccionario <> en C #. Tanto las matrices como las listas son densas.


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 índice 0: 400
Valor en índice 1: 400
Valor en índice 2: 400
Valor en índice 3: 400
Valor en índice 4: 400
Valor en índice 5: 400
Valor en índice 6: 400
Valor en índice 7: 400
Valor en índice índice 8: 400
Valor en el índice 9: 400
* /


¿Podría explicar esta solución?
Deep Frozen

Rune, acabo de incluir el comentario dentro del código fuente> Espero que pueda responder a tu pregunta.
jhyap

2

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


2

Si realmente necesita una matriz, lo siguiente es probablemente el 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();

2

Agregaré esto para otra variante. Prefiero este tipo de líneas de codificación funcional más.

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

1

Si no conoce el tamaño de la matriz o ya tiene una matriz existente a la que está agregando. Puedes hacer esto de dos maneras. El primero es usar un genérico List<T>: para hacer esto, querrá convertir la matriz a ay var termsList = terms.ToList();usar el método Agregar. Luego, cuando termine, use el var terms = termsList.ToArray();método para volver a convertirlo en 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án hacerlo dinámicamente. Si va a agregar muchos elementos, simplemente use a List<T>. Si solo se trata de un par de elementos, tendrá un mejor rendimiento al cambiar el tamaño de la matriz. Esto se debe a que recibes más golpes para crear el List<T>objeto.

Tiempos en garrapatas:

3 artículos

Tiempo de cambio de tamaño de matriz: 6

Agregar tiempo a la lista: 16

400 artículos

Tiempo de cambio de tamaño de matriz: 305

Agregar tiempo a la lista: 20


1

Solo un enfoque diferente:

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

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

return scorecard.Split("!");

3
Si bien es un poco novedoso, esto está realizando una gran cantidad de concatenación de cadenas y luego una gran operación de enumeración. No es la forma más eficiente o fácil de entender o leer de esto.
BradleyDotNET

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

solo practicando la programación de doble sentido
Ali Humayun

1

Un enfoque es llenar una matriz a través de LINQ

si quieres llenar una matriz con un elemento, simplemente puedes escribir

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

Además, si desea llenar una matriz con múltiples elementos, puede usar el código anterior en un bucle

//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

Para agregar los valores de lista a la matriz de cadenas usando C # sin usar el método 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();
        }

La salida de la matriz de valores contiene:

uno

dos

Tres

cuatro

cinco

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.