redimensionar - no permitir cambiar el tamaño de un form c#
cambiar el tamaño de la matriz (14)
En C #, Array.Resize
es el método más simple para cambiar el tamaño de cualquier matriz a un nuevo tamaño, por ejemplo:
Array.Resize<LinkButton>(ref area, size);
Aquí, quiero cambiar el tamaño de la matriz de la matriz LinkButton:
<LinkButton>
= especifica el tipo de matriz
ref area
= ref es una palabra clave y ''area'' es el nombre de la matriz
size
= nueva matriz de tamaño
¿Es posible cambiar el tamaño de una matriz después de la declaración? Si no, ¿hay alguna alternativa a los arreglos?
No quiero crear una matriz con un tamaño de 1000, pero no sé el tamaño de la matriz cuando la estoy creando.
En C #, las matrices no pueden redimensionarse dinámicamente.
Un enfoque es utilizar
System.Collections.ArrayList
lugar de unanative array
.Otra solución (más rápida) es volver a asignar la matriz con un tamaño diferente y copiar el contenido de la matriz antigua a la nueva matriz.
La función genérica
resizeArray
(abajo) se puede usar 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]); }
En caso de que no pueda usar Array.Reset
(la variable no es local), Concat
& ToArray
ayuda a:
anObject.anArray.Concat(new string[] { newArrayItem }).ToArray();
Esto me funcionó bien para crear una matriz dinámica a partir de una matriz de clase.
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++;
}
No, intente usar una List fuertemente tipada en su lugar.
Por ejemplo:
En lugar de usar
int[] myArray = new int[2];
myArray[0] = 1;
myArray[1] = 2;
Podrías hacer esto:
List<int> myList = new List<int>();
myList.Add(1);
myList.Add(2);
Las listas utilizan matrices para almacenar los datos, de modo que puede obtener el beneficio de la velocidad de las matrices con la conveniencia de una lista LinkedList
al poder agregar y eliminar elementos sin tener que preocuparse por tener que cambiar manualmente su tamaño.
Sin embargo, esto no significa que el tamaño de una matriz (en este caso, una List
) no haya cambiado, de ahí el énfasis en la palabra manualmente.
Tan pronto como su matriz alcance su tamaño predefinido, el JIT asignará una nueva matriz en el montón que es el doble del tamaño y copiará la matriz existente.
Puede usar Array.Resize()
, documentado en MSDN .
Pero sí, estoy de acuerdo con Corey, si necesita una estructura de datos de tamaño dinámico, tenemos List
para eso.
Importante: Array.Resize()
no Array.Resize()
tamaño de la matriz (el nombre del método es engañoso), crea una nueva matriz y solo reemplaza la reference que se pasó 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.
Puede usar Array.Resize()
en .net 3.5 y superior. Este método asigna una nueva matriz con el tamaño especificado, copia los elementos de la matriz anterior a la nueva, y luego reemplaza la matriz antigua por la nueva. (Por lo tanto, necesitará la memoria disponible para ambos arreglos, ya que probablemente utilice Array.Copy
debajo de las cubiertas)
Sí, es posible cambiar el tamaño de 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 crea una matriz con el método CreateInstance (), el método Resize () no funciona. 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 del arreglo no es dinámico, incluso podemos redimensionarlo. Si quieres una matriz dinámica, creo que podemos usar la lista genérica.
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);
}
Se utiliza este enfoque para la matriz de bytes:
Inicialmente:
byte[] bytes = new byte[0];
Cuando sea necesario (necesidad de proporcionar longitud original para extender):
Array.Resize<byte>(ref bytes, bytes.Length + requiredSize);
Reiniciar:
Array.Resize<byte>(ref bytes, 0);
Método de lista tipeada
Inicialmente:
List<byte> bytes = new List<byte>();
Cuando sea necesario:
bytes.AddRange(new byte[length]);
Liberar / Borrar:
bytes.Clear()
Utilice List
Utilice una List<T>
lugar. Por ejemplo, en lugar de una matriz de entradas
private int[] _myIntegers = new int[1000];
utilizar
private List<int> _myIntegers = new List<int>();
luego
_myIntegers.Add(1);
Utilice una Lista (donde T es cualquier tipo u Objeto) cuando desee agregar / eliminar datos, ya que cambiar el tamaño de las matrices es costoso. Puede leer más acerca de las matrices consideradas algo dañinas, mientras que se puede agregar una Lista a los registros Nuevos al final. Ajusta su tamaño según sea necesario.
Una lista puede ser inicializada de las siguientes maneras.
Utilizando inicializador de colección.
List<string> list1 = new List<string>()
{
"carrot",
"fox",
"explorer"
};
Utilizando la palabra clave var con inicializador de colección.
var list2 = new List<string>()
{
"carrot",
"fox",
"explorer"
};
Usando nueva matriz como parámetro.
string[] array = { "carrot", "fox", "explorer" };
List<string> list3 = new List<string>(array);
Uso de capacidad en constructor y 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";
Usando el método Add para cada elemento.
List<string> list5 = new List<string>();
list5.Add("carrot");
list5.Add("fox");
list5.Add("explorer");
Por lo tanto, para una Lista de objetos, puede asignar y asignar las propiedades de los objetos en línea con la inicialización de la Lista. Los inicializadores de objetos y los inicializadores de colecciones comparten una sintaxis similar.
class Test
{
public int A { get; set; }
public string B { get; set; }
}
Inicializar lista con inicializador de colección.
List<Test> list1 = new List<Test>()
{
new Test(){ A = 1, B = "Jessica"},
new Test(){ A = 2, B = "Mandy"}
};
Inicializar 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" });
Utilice 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;
}