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.
J'utiliserais une liste si vous avez besoin d'un tableau de taille dynamique:
List<string> ls = new List<string>();
ls.Add("Hello");
Cela pourrait être une solution;
Mais pour un tableau de taille dynamique, je préférerais aussi la liste.
la source
Utilisation de LINQ:
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 en argument.
ÉDITER:
Certaines personnes n'aiment pas
new[] { newitem }
car cela crée un petit tableau temporaire à un élément. Voici une version utilisantEnumerable.Repeat
qui ne nécessite la création d'aucun objet (du moins pas en surface - les itérateurs .NET créent probablement un tas d'objets de machine d'état sous la table).Et si vous êtes sûr que le tableau ne
null
démarre jamais , vous pouvez le simplifier comme suit:Notez que si vous souhaitez ajouter des éléments à une collection ordonnée, il
List
s'agit probablement de la structure de données souhaitée, pas d'un tableau pour commencer.la source
Très vieille question, mais je voulais toujours ajouter ceci.
Si vous recherchez un one-liner, vous pouvez utiliser le code ci-dessous. Il combine le constructeur de liste qui accepte un énumérable et la «nouvelle» syntaxe d'initialisation (depuis la question soulevée).
la source
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 Array.Resize :
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'indice pour cela est le mot-clé ref pour le premier paramètre.
Il existe des listes qui peuvent allouer dynamiquement de nouveaux emplacements pour de nouveaux éléments. Il s'agit par exemple de List <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!).ArrayList est la même chose sans Generics (avec un tableau Object ).
LinkedList <T> est une véritable implémentation de liste chaînée. Malheureusement, vous pouvez ajouter uniquement des éléments LinkListNode <T> à la liste, vous devez donc encapsuler vos propres éléments de liste dans ce type de nœud. Je pense que son utilisation est rare.
la source
Aray.Resize
on peut redimensionner un tableau sans perdre son contenu. docs.microsoft.com/en-us/dotnet/api/…la source
Vous pouvez développer la réponse fournie par @Stephen Chung en utilisant sa logique basée sur LINQ pour créer une méthode d'extension à l'aide d'un type générique.
Vous pouvez alors l'appeler directement sur le tableau comme ceci.
Certes, la méthode AddRangeToArray () semble un peu exagérée puisque vous avez la même fonctionnalité avec Concat () mais de cette façon, le code de fin peut "travailler" avec le tableau directement par opposition à ceci:
la source
Il est préférable de garder Array immuable et de taille fixe.
vous pouvez simuler
Add
parExtension Method
etIEnumerable.Concat()
la source
si vous travaillez beaucoup avec des tableaux et non des listes pour une raison quelconque, cette méthode générique générique de retour typé
Add
pourrait vous aiderla source
Toutes les réponses proposées font la même chose que ce qu'elles disent vouloir éviter, en créant un nouveau tableau et en y ajoutant une nouvelle entrée uniquement avec une perte de plus de frais généraux. LINQ n'est pas magique, la liste de T est un tableau avec un espace tampon avec un peu d'espace supplémentaire pour éviter de redimensionner le tableau interne lorsque des éléments sont ajoutés.
Toutes les abstractions doivent résoudre le même problème, créer un tableau sans emplacements vides contenant toutes les valeurs et les renvoyer.
Si vous avez besoin de flexibilité et que vous pouvez créer une liste suffisamment grande que vous pouvez utiliser pour passer, faites-le. Sinon, utilisez un tableau et partagez cet objet thread-safe. En outre, le nouveau Span permet de partager des données sans avoir à copier les listes.
Pour répondre à la question:
la source
Donc, si vous avez un tableau existant, ma solution rapide sera
Maintenant, remplacez simplement le tableau d'origine par le nouveau
la source
Une nouvelle
Append<TSource>
méthode a été ajoutée àIEnumerable<TSource>
depuis .NET Framework 4.7.1 et .NET Core 1.0.Voici comment l'utiliser:
Notez que si vous souhaitez ajouter l'élément au début du tableau, vous pouvez utiliser la nouvelle
Prepend<TSource>
méthode à la place.la source
L'utilisation d'une liste serait votre meilleure option pour la gestion de la mémoire.
la source
Qu'en est-il de l'utilisation d'une méthode d'extension? Par exemple:
par exemple:
Notez que cela imite ce comportement de l'extension Uniion de Linq (utilisée pour combiner deux tableaux en un nouveau) et nécessitait que la bibliothèque Linq fonctionne.
la source
Je suis d'accord avec Ed. C # ne facilite pas cela comme le fait VB avec ReDim Preserve. Sans collection, vous devrez copier le tableau dans un plus grand.
la source
ReDim Preserve
copie simplement le tableau dans un plus lager. Il n'y a pas de redimensionnement miraculeux du tableau.la source
la source
Pourquoi ne pas essayer la classe Stringbuilder . Il a des méthodes telles que .insert et .append. Vous pouvez en savoir plus ici: http://msdn.microsoft.com/en-us/library/2839d5h5(v=vs.71).aspx
la source
Malheureusement, l'utilisation d'une liste ne fonctionnera pas dans toutes les situations. Une liste et un tableau sont en fait différents et ne sont pas interchangeables à 100%. Cela dépendrait des circonstances si ce serait une solution acceptable.
la source
Puisque cette question n'est pas satisfaite de la réponse fournie, j'aimerais ajouter cette réponse :)
la source