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;
}
Ross
fuente
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).

Tamas Czinege
fuente
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);
David Mitchell
fuente
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

Itzjak Weinberg
fuente
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);
}
FlySwat
fuente
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.

Thracx
fuente
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.

marca
fuente
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;
}
Motti
fuente
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.

JB King
fuente
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.

Palanqueta
fuente
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
* /

jhyap
fuente
¿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.

Michael Stum
fuente
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();
Steve
fuente
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();
David
fuente
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

LCarter
fuente
1

Solo un enfoque diferente:

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

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

return scorecard.Split("!");
Ali Humayun
fuente
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();
}
Safi Habhab
fuente
0
int[] terms = new int[400];

for(int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}
Johnno Nolan
fuente
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.*/
        }
usuario3404904
fuente
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;
            }
usuario3404904
fuente
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

Maghalakshmi Saravana
fuente