Comment ajouter une chaîne à un tableau de chaînes []? Il n'y a pas de fonction .Add


222
private string[] ColeccionDeCortes(string Path)
{
    DirectoryInfo X = new DirectoryInfo(Path);
    FileInfo[] listaDeArchivos = X.GetFiles();
    string[] Coleccion;

    foreach (FileInfo FI in listaDeArchivos)
    {
        //Add the FI.Name to the Coleccion[] array, 
    }

    return Coleccion;
}

Je voudrais convertir le FI.Nameen une chaîne, puis l'ajouter à mon tableau. Comment puis-je faire ceci?

Réponses:


395

Vous ne pouvez pas ajouter d'éléments à un tableau, car il a une longueur fixe. Ce que vous recherchez est un List<string>, qui peut ensuite être transformé en tableau en utilisant list.ToArray(), par exemple

List<string> list = new List<string>();
list.Add("Hi");
String[] str = list.ToArray();

3
+1 J'irai de l'avant et offrirai un lien vers ma réponse à ce sujet. stackoverflow.com/questions/1168915/…
Sam Harwell

2
"Vous ne pouvez pas ajouter des éléments à un tableau" - en fait, vous pouvez, voir ci-dessous.
Alex Strickland

112

Vous pouvez également redimensionner le tableau.

Array.Resize(ref array, array.Length + 1);
array[array.Length - 1] = "new string";

6
Array.Resize est la bonne façon de redimensionner un tableau. Si vous ajoutez un commentaire avant l'extrait de code indiquant que c'est rarement la meilleure façon de gérer les situations où le tableau représente une collection redimensionnable, vous obtenez un +1. :)
Sam Harwell

12
En fait, c'est la (seule) réponse qui résout exactement la question OP.
dialex

66

Utilisez List <T> de System.Collections.Generic

List<string> myCollection = new List<string>();



myCollection.Add(aString);

Ou, sténographie (en utilisant l'initialiseur de collection):

List<string> myCollection = new List<string> {aString, bString}

Si vous voulez vraiment un tableau à la fin, utilisez

myCollection.ToArray();

Vous feriez mieux de résumer une interface, comme IEnumerable, puis de simplement renvoyer la collection.

Modifier: si vous devez utiliser un tableau, vous pouvez le préallouer à la bonne taille (c'est-à-dire le nombre de FileInfo que vous avez). Ensuite, dans la boucle foreach, conservez un compteur pour l'index de tableau que vous devez mettre à jour ensuite.

private string[] ColeccionDeCortes(string Path)
{
    DirectoryInfo X = new DirectoryInfo(Path);
    FileInfo[] listaDeArchivos = X.GetFiles();
    string[] Coleccion = new string[listaDeArchivos.Length];
    int i = 0;

    foreach (FileInfo FI in listaDeArchivos)
    {
        Coleccion[i++] = FI.Name;
        //Add the FI.Name to the Coleccion[] array, 
    }

    return Coleccion;
}

Ma méthode pour joindre ne reçoit qu'un tableau de chaînes [], je ne peux pas utiliser une liste <>. Existe-t-il un moyen de résoudre ce problème à l'aide d'un tableau?
Sergio Tapia

1
Utilisez une liste <chaîne> puis lorsque vous avez besoin du tableau, appelez la méthode ToArray
Chris Dunaway

30

Eazy

// Create list
var myList = new List<string>();

// Add items to the list
myList.Add("item1");
myList.Add("item2");

// Convert to array
var myArray = myList.ToArray();

2
* Addnon add.
bigp


6

Voici comment j'ajoute à une chaîne en cas de besoin:

string[] myList;
myList = new string[100];
for (int i = 0; i < 100; i++)
{
    myList[i] = string.Format("List string : {0}", i);
}

3
string[] coleccion = Directory.GetFiles(inputPath)
    .Select(x => new FileInfo(x).Name)
    .ToArray();

3

Pourquoi n'utilisez-vous pas une boucle for au lieu d'utiliser foreach. Dans ce scénario, il est impossible d'obtenir l'index de l'itération actuelle de la boucle foreach.

Le nom du fichier peut être ajouté à la chaîne [] de cette façon,

private string[] ColeccionDeCortes(string Path)
{
  DirectoryInfo X = new DirectoryInfo(Path);
  FileInfo[] listaDeArchivos = X.GetFiles();
  string[] Coleccion=new string[listaDeArchivos.Length];

  for (int i = 0; i < listaDeArchivos.Length; i++)
  {
     Coleccion[i] = listaDeArchivos[i].Name;
  }

  return Coleccion;
}

Seul problème: vous DEVEZ savoir quelle est votre longueur listaDeArchivos. Si vous ne le faites pas (c.-à-d. Si cela pourrait changer et qu'il serait complexe de faire un décompte à l'avance parce que vos objets sont des modèles imbriqués ou des champs de modèle qui peuvent / peuvent ne pas être remplis, par exemple) et que vous voulez simplement le faire string[] Coleccion;puis attribuez-le comme int idx = 0; Coleccion[idx] = fileName; idx++;, il vous le dira Use of unassigned local variable 'Coleccion'. Juste pour info pour quiconque souhaite adapter cela pour être plus dynamique, qu'il y a un piège.
vapcguy

1

Ce code fonctionne très bien pour préparer les valeurs dynamiques Array for spinner dans Android:

    List<String> yearStringList = new ArrayList<>();
    yearStringList.add("2017");
    yearStringList.add("2018");
    yearStringList.add("2019");


    String[] yearStringArray = (String[]) yearStringList.toArray(new String[yearStringList.size()]);

1

pour effacer le tableau et faire le nombre de ses éléments = 0 en même temps, utilisez ceci ..

System.Array.Resize(ref arrayName, 0);

0

Je n'utiliserais pas de tableau dans ce cas. Au lieu de cela, j'utiliserais un StringCollection.

using System.Collections.Specialized;

private StringCollection ColeccionDeCortes(string Path)   
{

    DirectoryInfo X = new DirectoryInfo(Path);

    FileInfo[] listaDeArchivos = X.GetFiles();
    StringCollection Coleccion = new StringCollection();

    foreach (FileInfo FI in listaDeArchivos)
    {
        Coleccion.Add( FI.Name );
    }
    return Coleccion;
}

0
string[] MyArray = new string[] { "A", "B" };
MyArray = new List<string>(MyArray) { "C" }.ToArray();
//MyArray = ["A", "B", "C"]

Ce pourrait être une bonne idée d'expliquer pourquoi un tableau est un mauvais choix ici et OP devrait utiliser List <> pour commencer.
LueTm

0

Ajout d'une référence à Linq using System.Linq;et utilisation de la méthode d'extension fournie Append: public static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element) vous devez ensuite la reconvertir en string[]utilisant.ToArray() méthode.

Il est possible, parce que le type string[]met en œuvre IEnumerable, il met également en œuvre les interfaces suivantes: IEnumerable<char>, IEnumerable, IComparable, IComparable<String>, IConvertible, IEquatable<String>,ICloneable

using System.Linq;
public string[] descriptionSet new string[] {"yay"};
descriptionSet = descriptionSet.Append("hooray!").ToArray();  
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.