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?

Sergio Tapia
la source

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();
Saulius Valatka
la source
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";

la source
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;
}
Adam Wright
la source
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();
NoloMokgosi
la source
2
* Addnon add.
bigp
9

Si je ne me trompe pas, c'est:

MyArray.SetValue(ArrayElement, PositionInArray)
Stefan Nicolov
la source
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);
}
kittugadu
la source
3
string[] coleccion = Directory.GetFiles(inputPath)
    .Select(x => new FileInfo(x).Name)
    .ToArray();
xcud
la source
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;
}
Sarath Rachuri
la source
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()]);
Taras Vovkovych
la source
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);
DeyaEldeen
la source
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;
}
DatRid
la source
0
string[] MyArray = new string[] { "A", "B" };
MyArray = new List<string>(MyArray) { "C" }.ToArray();
//MyArray = ["A", "B", "C"]
Konstantin Lapeev
la source
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();  
proximab
la source