159 votes

Ajouter un nouvel élément dans un tableau existant en c#.net

Comment ajouter un nouvel élément dans un tableau de chaînes existant en C#.net ?

J'ai besoin de préserver les données existantes.

128voto

Ed S. Points 70246

J'utiliserais une liste si vous avez besoin d'un tableau de taille dynamique :

List<string> ls = new List<string>();
ls.Add("Hello");

35 votes

Et si nécessaire, faire ls.ToArray() à la fin

7 votes

L'utilisation d'un autre mécanisme que celui demandé dans la question n'est pas une réponse.

0 votes

@user2190035 : Je ne sais pas trop où vous avez trouvé cette idée, et les 111 personnes qui ont voté en amont ne sont pas d'accord avec vous. Si vous connaissez une meilleure façon d'étendre un tableau, alors n'hésitez pas à la poster. Je doute que votre réallocation et votre copie manuelle soient meilleures que l'utilisation d'une liste. Parfois la réponse est "ne faites pas ça".

116voto

Ali Ersöz Points 6699

Cela pourrait être une solution ;

Array.Resize(ref array, newsize);
array[newsize - 1] = "newvalue"

Mais pour les tableaux de taille dynamique, je préférerais aussi la liste.

0 votes

@Konrad, cela préservera certainement les données dans le tableau.

4 votes

Ce n'est pas adapté pour plus de quelques invocations. parce que la fonction 'Resize' est très performante. mais pour une ou deux invocations, c'est très bien.

1 votes

@ad Ne pas pré-optimiser. Cela convient parfaitement, à moins que les tests de référence, quel que soit le contexte dans lequel ils sont utilisés, ne déterminent que ce n'est pas le cas.

55voto

Stephen Chung Points 9467

Utilisation de LINQ :

arr = (arr ?? Enumerable.Empty<string>()).Concat(new[] { newitem }).ToArray();

J'aime l'utiliser car il s'agit d'une ligne unique et très pratique à intégrer dans une instruction switch, une simple instruction if, ou à passer comme argument.

EDIT :

Certaines personnes n'aiment pas new[] { newitem } car il crée un petit tableau temporaire d'un seul élément. Voici une version utilisant Enumerable.Repeat qui ne nécessite pas la création d'un objet (du moins pas en apparence - les itérateurs .NET créent probablement un tas d'objets de machine d'état sous la table).

arr = (arr ?? Enumerable.Empty<string>()).Concat(Enumerable.Repeat(newitem,1)).ToArray();

Et si vous êtes sûr que le tableau n'est jamais null pour commencer, vous pouvez le simplifier en :

arr.Concat(Enumerable.Repeat(newitem,1)).ToArray();

Notez que si vous voulez ajouter des éléments à une collection ordonnée, List est probablement la structure de données que vous voulez, pas un tableau pour commencer.

2 votes

Très bien +1. J'ai un code similaire en tant que méthode d'extension générique. J'ai inclus le code dans cette réponse : stackoverflow.com/a/11035286/673545

0 votes

C'est très utile, je l'ai trouvé en cherchant "how to append to an array in one line of code in c#" - j'espère que ce commentaire suffira à le retrouver la prochaine fois.

37voto

Grimace of Despair Points 1582

Très vieille question, mais je voulais quand même ajouter ceci.

Si vous cherchez une phrase unique, vous pouvez utiliser le code ci-dessous. Il combine le constructeur de liste qui accepte un énumérable et la syntaxe de l'initialisateur "new" (depuis la question posée).

myArray = new List<string>(myArray) { "add this" }.ToArray();

31voto

artur02 Points 3533

Les tableaux en C# sont immuables par exemple string[] , int[] . Cela signifie que vous ne pouvez pas les redimensionner. Vous devez créer un tout nouveau tableau.

Voici le code pour Redimensionner un tableau :

public static void Resize<T>(ref T[] array, int newSize)
{
    if (newSize < 0)
    {
        throw new ArgumentOutOfRangeException("newSize", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
    }
    T[] sourceArray = array;
    if (sourceArray == null)
    {
        array = new T[newSize];
    }
    else if (sourceArray.Length != newSize)
    {
        T[] destinationArray = new T[newSize];
        Copy(sourceArray, 0, destinationArray, 0, (sourceArray.Length > newSize) ? newSize : sourceArray.Length);
        array = destinationArray;
    }
}

Comme vous pouvez le voir, il crée un nouveau tableau avec la nouvelle taille, copie le contenu du tableau source et définit la référence au nouveau tableau. L'astuce pour cela est la fonction réf. pour le premier paramètre.

Il existe des listes qui peuvent allouer dynamiquement de nouveaux créneaux horaires pour les nouveaux articles. Il s'agit par exemple de Liste<T> . Ceux-ci contiennent des tableaux immuables et les redimensionnent si nécessaire (List<T> n'est pas une implémentation de liste chaînée !). Liste de tableaux est la même chose sans les génériques (avec Objet ).

Liste de liens<T> est une véritable implémentation de liste liée. Malheureusement, vous ne pouvez ajouter que des éléments LinkListNode<T> à la liste, vous devez donc envelopper vos propres éléments de liste dans ce type de nœud. Je pense que son utilisation est peu courante.

0 votes

Je pense que vous avez voulu dire Array.Copy

2 votes

Seule une réponse qui explique pourquoi ce n'est pas possible et qui ne se contente pas de suggérer l'utilisation d'une liste...

1 votes

Je crois Aray.Resize permet de redimensionner un tableau sans en perdre le contenu. docs.microsoft.com/en-us/dotnet/api/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X