Est-il possible de changer la taille d'un tableau après la déclaration? Sinon, existe-t-il une alternative aux tableaux?
Je ne veux pas créer un tableau avec une taille de 1000, mais je ne connais pas la taille du tableau lorsque je le crée.
Non, essayez plutôt d'utiliser un Liste fortement typé.
Par exemple:
À la place d'utiliser
int[] myArray = new int[2];
myArray[0] = 1;
myArray[1] = 2;
Vous pourriez faire ceci:
List<int> myList = new List<int>();
myList.Add(1);
myList.Add(2);
Les listes utilisent des tableaux pour stocker les données afin que vous profitiez de la rapidité d'utilisation des tableaux avec la commodité d'un LinkedList
en étant en mesure d'ajouter et de supprimer des éléments sans vous soucier de devoir manuellement change sa taille.
Cela ne signifie pas pour autant que la taille d'un tableau (dans ce cas, un List
) ne soit pas modifiée - d'où l'accent mis manuellement sur Word.
Dès que votre tableau atteint sa taille prédéfinie, le JIT allouera un nouveau tableau sur le tas deux fois plus grand et copiera votre tableau existant.
Vous pouvez utiliser Array.Resize()
, documenté dans MSDN .
Mais oui, je suis d’accord avec Corey, si vous avez besoin d’une structure de données de taille dynamique, nous avons List
s pour cela.
Important: Array.Resize()
ne redimensionne pas le tableau (le nom de la méthode est trompeur), il crée un nouveau tableau et remplace uniquement le paramètre référence que vous avez transmis à la méthode.
Un exemple:
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.
Vous pouvez utiliser Array.Resize()
dans .net 3.5 et supérieur. Cette méthode alloue un nouveau tableau avec la taille spécifiée, copie des éléments de l'ancien tableau dans le nouveau, puis remplace l'ancien tableau par le nouveau . (Vous aurez donc besoin de la mémoire disponible pour les deux tableaux utilise Array.Copy
sous les couvertures)
Utilisé cette approche pour un tableau d'octets:
Initialement:
byte[] bytes = new byte[0];
Chaque fois que nécessaire (nécessité de fournir la longueur d'origine pour l'extension):
Array.Resize<byte>(ref bytes, bytes.Length + requiredSize);
Réinitialiser:
Array.Resize<byte>(ref bytes, 0);
Méthode de liste typée
Initialement:
List<byte> bytes = new List<byte>();
Chaque fois que nécessaire:
bytes.AddRange(new byte[length]);
Libérer/Effacer:
bytes.Clear()
Utilisez System.Collections.Generic.List
Utilisez un List<T>
à la place. Par exemple, au lieu d'un tableau d'ints
private int[] _myIntegers = new int[1000];
utilisation
private List<int> _myIntegers = new List<int>();
plus tard
_myIntegers.Add(1);
En C #, les tableaux ne peuvent pas être redimensionnés dynamiquement.
Une approche consiste à utiliserSystem.Collections.ArrayList
à la place D'unnative array
.
Une autre solution (plus rapide) consiste à Réallouer le tableau avec une taille Différente et à copier le contenu De l'ancien tableau dans le nouveau tableau
La fonction génériqueresizeArray
(ci-dessous) peut être utilisée pour cela.
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]);
}
Array.Resize
est la méthode la plus simple pour redimensionner un tableau à une nouvelle taille, par exemple:
Array.Resize<LinkButton>(ref area, size);
Ici, je veux redimensionner la taille du tableau de LinkButton:
<LinkButton>
= spécifie le type de tableauref area
= ref est un mot clé et 'area' est le nom du tableausize
= nouveau tableau de taille
Oui, il est possible de redimensionner un tableau. Par exemple:
int[] arr = new int[5];
// increase size to 10
Array.Resize(ref arr, 10);
// decrease size to 3
Array.Resize(ref arr, 3);
Si vous créez un tableau avec la méthode CreateInstance (), la méthode Resize () ne fonctionne pas. Par exemple:
// create an integer array with size of 5
var arr = Array.CreateInstance(typeof(int), 5);
// this not work
Array.Resize(ref arr, 10);
La taille du tableau n'est pas dynamique, même si nous pouvons le redimensionner. Si vous voulez un tableau dynamique, je pense que nous pouvons utiliser la liste générique à la place.
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);
}
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;
}
Utilisez une liste (où T est un type ou un objet) lorsque vous souhaitez ajouter/supprimer des données, car le redimensionnement des tableaux est coûteux. Vous pouvez en savoir plus sur Les tableaux considérés comme quelque peu nuisibles alors qu'une liste peut être ajoutée à Nouveaux enregistrements peuvent être ajoutés à la fin. Il ajuste sa taille au besoin.
Une liste peut être créée de différentes manières
Utilisation de l'initialiseur de collection.
List<string> list1 = new List<string>()
{
"carrot",
"fox",
"Explorer"
};
Utilisation du mot clé var avec l'initialiseur de collection.
var list2 = new List<string>()
{
"carrot",
"fox",
"Explorer"
};
Utiliser un nouveau tableau comme paramètre.
string[] array = { "carrot", "fox", "Explorer" };
List<string> list3 = new List<string>(array);
Utilisation de la capacité en constructeur et assign.
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";
Utilisation de la méthode Add pour chaque élément.
List<string> list5 = new List<string>();
list5.Add("carrot");
list5.Add("fox");
list5.Add("Explorer");
Ainsi, pour une liste d'objets, vous pouvez affecter et attribuer les propriétés des objets en ligne avec l'initialisation de la liste. Les initialiseurs d'objet et les initialiseurs de collection partagent une syntaxe similaire.
class Test
{
public int A { get; set; }
public string B { get; set; }
}
Initialiser la liste avec l'initialiseur de collection.
List<Test> list1 = new List<Test>()
{
new Test(){ A = 1, B = "Jessica"},
new Test(){ A = 2, B = "Mandy"}
};
Initialiser la liste avec de nouveaux objets.
List<Test> list2 = new List<Test>();
list2.Add(new Test() { A = 3, B = "Sarah" });
list2.Add(new Test() { A = 4, B = "Melanie" });
Si vous ne pouvez pas utiliser Array.Reset
(la variable n’est pas locale), alors Concat
& ToArray
vous aidera:
anObject.anArray.Concat(new string[] { newArrayItem }).ToArray();
Cela a bien fonctionné pour moi de créer un tableau dynamique à partir d'un tableau de classe.
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++;
}
Si vous avez vraiment besoin de le récupérer dans un tableau, je trouve qu'il est plus facile de convertir la variable array
en une variable list
, puis la reconvertir en une variable array
.
string[] myArray = new string[1] {"Element One"};
// Convert it to a list
List<string> resizeList = myArray.ToList();
// Add some elements
resizeList.Add("Element Two");
// Back to an array
myArray = resizeList.ToArray();
// myArray has grown to two elements.