¿Es posible cambiar el tamaño de una matriz después de la declaración? Si no, ¿hay alguna alternativa a las matrices?
No quiero crear una matriz con un tamaño de 1000, pero no sé el tamaño de la matriz cuando la estoy creando.cambiar el tamaño de la matriz
Respuesta
No, intente utilizar un List fuertemente tipado en su lugar.
Por ejemplo:
En lugar de utilizar
int[] myArray = new int[2];
myArray[0] = 1;
myArray[1] = 2;
usted puede hacer esto:
List<int> myList = new List<int>();
myList.Add(1);
myList.Add(2);
Listas utilizan matrices para almacenar los datos para que pueda obtener el beneficio velocidad de matrices con la conveniencia de LinkedList
al poder agregar y eliminar elementos sin tener que preocuparse por tener que cambiar manualmente cambiar su tamaño.
Esto no significa que el tamaño de una matriz (en este caso, un List
) no se haya modificado, de ahí el énfasis en la palabra manualmente.
Tan pronto como su matriz llegue a su tamaño predefinido, el JIT asignará una nueva matriz en el montón que es dos veces el tamaño y copiará su matriz existente.
Puede utilizar Array.Resize()
, documentada en MSDN.
Pero sí, estoy de acuerdo con Corey, si necesita una estructura de datos de tamaño dinámico, tenemos List
s para eso.
Importante: Array.Resize()
no cambia de tamaño la matriz (el nombre del método es engañosa), se crea una nueva matriz y sólo reemplaza el reference se pasa al método.
Un ejemplo:
var array1 = new byte[10];
var array2 = array1;
Array.Resize<byte>(ref array1, 20);
// Now:
// array1.Length is 20
// array2.Length is 10
// Two different arrays.
Utilice un List<T>
lugar. Por ejemplo, en lugar de una matriz de enteros
private int[] _myIntegers = new int[1000];
uso
private List<int> _myIntegers = new List<int>();
tarde
_myIntegers.Add(1);
Puede utilizar Array.Resize()
en .NET 3.5 y superior. Este método asigna una nueva matriz con el tamaño especificado, copia elementos de la matriz anterior a la nueva, y luego reemplaza la matriz anterior por la nueva. (Por lo tanto, necesitará la memoria disponible para ambas matrices ya que probablemente use Array.Copy
debajo de las cubiertas)
En C#, las matrices no pueden redimensionarse dinámicamente.
Un método consiste en utilizar
System.Collections.ArrayList
lugar de unnative array
.Otra solución (más rápido) es reasignar la matriz con un tamaño diferente y para copiar los contenido de la matriz de edad a la nueva matriz.
La función genérica
resizeArray
(abajo) se puede utilizar para hacer eso.public static System.Array ResizeArray (System.Array oldArray, int newSize) { int oldSize = oldArray.Length; System.Type elementType = oldArray.GetType().GetElementType(); System.Array newArray = System.Array.CreateInstance(elementType,newSize); int preserveLength = System.Math.Min(oldSize,newSize); if (preserveLength > 0) System.Array.Copy (oldArray,newArray,preserveLength); return newArray; } public static void Main() { int[] a = {1,2,3}; a = (int[])ResizeArray(a,5); a[3] = 4; a[4] = 5; for (int i=0; i<a.Length; i++) System.Console.WriteLine (a[i]); }
utilizar una lista genérica (System.Collections.Generic.List).
private void HandleResizeArray()
{
int[] aa = new int[2];
aa[0] = 0;
aa[1] = 1;
aa = MyResizeArray(aa);
aa = MyResizeArray(aa);
}
private int[] MyResizeArray(int[] aa)
{
Array.Resize(ref aa, aa.GetUpperBound(0) + 2);
aa[aa.GetUpperBound(0)] = aa.GetUpperBound(0);
return aa;
}
¿Qué haces al hacer UpperBound? – whihathac
utilizado este enfoque para la matriz de bytes:
Inicialmente:
byte[] bytes = new byte[0];
Siempre que sea necesario (necesidad de proporcionar longitud original para extender):
Array.Resize<byte>(ref bytes, bytes.Length + requiredSize);
Reset:
Array.Resize<byte>(ref bytes, 0);
Lista Typed Método
Inicialmente:
List<byte> bytes = new List<byte>();
Siempre que sea necesario:
bytes.AddRange(new byte[length]);
LANZAMIENTO/Borrar:
bytes.Clear()
En C#, Array.Resize
es el método más sencillo para cambiar el tamaño de cualquier matriz de nuevo tamaño, por ejemplo:
Array.Resize<LinkButton>(ref area, size);
Aquí, quiero cambiar el tamaño del tamaño de la matriz de la matriz LinkButton:
<LinkButton>
= especifica la matriz escriba
ref area
= ref es una palabra clave y 'área' es el nombre de la matriz
size
= nuevo tamaño de la matriz
Sí, es posible resi ze una matriz.Por ejemplo:
int[] arr = new int[5];
// increase size to 10
Array.Resize(ref arr, 10);
// decrease size to 3
Array.Resize(ref arr, 3);
Si se crea una matriz con el método CreateInstance(), el método de cambio de tamaño() no está funcionando. Por ejemplo:
// create an integer array with size of 5
var arr = Array.CreateInstance(typeof(int), 5);
// this not work
Array.Resize(ref arr, 10);
El tamaño de la matriz no es dinámico, incluso podemos cambiar su tamaño. Si desea una matriz dinámica, creo que podemos usar una lista genérica en su lugar.
var list = new List<int>();
// add any item to the list
list.Add(5);
list.Add(8);
list.Add(12);
// we can remove it easily as well
list.Remove(5);
foreach(var item in list)
{
Console.WriteLine(item);
}
Utilice una lista (donde T es cualquier tipo de objeto o) cuando se desea añadir/eliminar los datos, ya que el cambio de tamaño matrices es caro. Puede leer más sobre Arrays considered somewhat harmful, mientras que una lista se puede agregar a los nuevos registros se pueden agregar al final. Ajusta su tamaño según sea necesario.
Una lista puede ser initalized en las formas siguientes
Uso de inicializador de colección.
List<string> list1 = new List<string>()
{
"carrot",
"fox",
"explorer"
};
Utilizando la palabra clave var con el inicializador de recopilación.
var list2 = new List<string>()
{
"carrot",
"fox",
"explorer"
};
Utilizando nueva matriz como parámetro.
string[] array = { "carrot", "fox", "explorer" };
List<string> list3 = new List<string>(array);
Usando la capacidad en el constructor y la asignación.
List<string> list4 = new List<string>(3);
list4.Add(null); // Add empty references. (Not Recommended)
list4.Add(null);
list4.Add(null);
list4[0] = "carrot"; // Assign those references.
list4[1] = "fox";
list4[2] = "explorer";
Uso del método Agregar para cada elemento.
List<string> list5 = new List<string>();
list5.Add("carrot");
list5.Add("fox");
list5.Add("explorer");
Así, para una lista de objetos se puede ubicar y asignar las propiedades de los objetos en línea con la inicialización de lista. Los inicializadores de objeto y los inicializadores de recopilación comparten una sintaxis similar.
class Test
{
public int A { get; set; }
public string B { get; set; }
}
Inicializar la lista con el inicializador de recopilación.
List<Test> list1 = new List<Test>()
{
new Test(){ A = 1, B = "Jessica"},
new Test(){ A = 2, B = "Mandy"}
};
Inicializar la lista con nuevos objetos.
List<Test> list2 = new List<Test>();
list2.Add(new Test() { A = 3, B = "Sarah" });
list2.Add(new Test() { A = 4, B = "Melanie" });
Esto funcionó bien para mí para crear una matriz dinámica a partir de una matriz de clases.
var s = 0;
var songWriters = new SongWriterDetails[1];
foreach (var contributor in Contributors)
{
Array.Resize(ref songWriters, s++);
songWriters[s] = new SongWriterDetails();
songWriters[s].DisplayName = contributor.Name;
songWriters[s].PartyId = contributor.Id;
s++;
}
- 1. Cambiar el tamaño de una matriz 3D
- 2. Cambiar el tamaño de una matriz
- 3. cambiar el tamaño del texto (tamaño de fuente) al cambiar el tamaño de la ventana?
- 4. Cambiar el tamaño de una matriz con C
- 5. ¿Cómo puedo cambiar el tamaño de una matriz en C?
- 6. cambiar el tamaño de la página
- 7. ckfinder cambiar el tamaño de la imagen
- 8. ¿Cambiar el tamaño de la fuente macvim?
- 9. UIImageView: ¿Cambiar el tamaño al tamaño de la imagen?
- 10. Cambiar el tamaño de la imagen JPEG al tamaño especificado
- 11. jScrollPane cambiar el tamaño
- 12. Obtener tamaño de imagen real, después de cambiar el tamaño
- 13. jqplot cambiar el tamaño de la tabla al cambiar el tamaño del navegador
- 14. ¿Cambiar el tamaño de UIStepper?
- 15. UIButton cambiar el tamaño con la animación
- 16. Obtener ListBox para cambiar el tamaño con la ventana, pero no cambiar el tamaño del contenido
- 17. C Tamaño de la matriz
- 18. tamaño de la matriz NumPy
- 19. ¿Se puede cambiar el tamaño de una matriz C++ después de la inicialización?
- 20. ¿Cómo cambiar el tamaño de la altura máxima de un div al cambiar el tamaño de la ventana?
- 21. Cambiar el lado de un jScrollPane y cambiar el tamaño
- 22. Cambiar el tamaño de paneles en GUI sin cambiar el tamaño de los contenidos (MATLAB)
- 23. ¿Cambia el tamaño de la matriz al GC?
- 24. Empalme una matriz por la mitad, sin importar el tamaño?
- 25. Cambiar el tamaño de la imagen de mapa de bits
- 26. Cómo cambiar el tamaño de UIButton
- 27. Cambiar el tamaño de UITableView programáticamente
- 28. Cómo cambiar el tamaño de ObservableCollection?
- 29. ¿Cambiar el tamaño de SVG en html?
- 30. Cambiar el tamaño de una pantalla Xvfb
Si Array.Resize() es solo una vez al principio (y no varias veces durante el programa), ¿es eso más adecuado que una lista? –
'List' usa una matriz detrás de escena, por lo que hay muy pocas razones para usar una matriz en C#. Las listas se pueden inicializar a un tamaño adecuado utilizando este constructor: http://msdn.microsoft.com/en-us/library/dw8e0z9z.aspx. Pero sí, si su corazón está configurado en Arrays, es mejor redimensionarlos con la menor frecuencia posible. –
Pensé que la lista usa una lista vinculada o alguna estructura de datos detrás. Entonces usa una matriz después de todo. –
dpp