web-dev-qa-db-fra.com

changer la taille du tableau

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.

51
user522860

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.

52
Corey Sunwold

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 Lists 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.
55
Chris Shain

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)

10
DerpDerp

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()
6
KbManu
5
kelloti

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);
5
John Saunders

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]); 
            }
    
5
sgokhales

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 tableau
ref area = ref est un mot clé et 'area' est le nom du tableau
size = nouveau tableau de taille

4
Rajesh Londhe

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);
}
3
HENG Vongkol
    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;
    }
3
user2235895

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" });
1
Mohit Shrivastava

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();
0
Miq

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++;
}
0
PhillipPDX

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.
0
clamchoda