Come aggiungere una stringa a un array stringa []? Non esiste alcuna funzione .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;
}

Vorrei convertirlo FI.Namein una stringa e quindi aggiungerlo al mio array. Come posso fare questo?

Risposte:


395

Non è possibile aggiungere elementi a un array, poiché ha una lunghezza fissa. Quello che stai cercando è un List<string>, che può essere successivamente trasformato in un array usando list.ToArray(), ad es

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

3
+1 Andrò avanti e offrirò un link alla mia risposta su questo argomento. stackoverflow.com/questions/1168915/…
Sam Harwell,

2
"Non è possibile aggiungere elementi a un array" - in realtà è possibile, vedere di seguito.
Alex Strickland,

112

In alternativa, è possibile ridimensionare l'array.

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

6
Array.Resize è il modo corretto di ridimensionare un array. Se aggiungi un commento prima dello snippet di codice dicendo che raramente è il modo migliore per gestire le situazioni in cui l'array rappresenta una raccolta ridimensionabile, hai un +1. :)
Sam Harwell,

12
In realtà, questa è la (sola) risposta che risolve esattamente la domanda OP.
dialex,

66

Utilizzare l'elenco <T> da System.Collections.Generic

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



myCollection.Add(aString);

Oppure, stenografia (usando l'inizializzatore di raccolta):

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

Se vuoi davvero un array alla fine, usa

myCollection.ToArray();

Potrebbe essere meglio astrarre su un'interfaccia, come IEnumerable, quindi restituire la raccolta.

Modifica: se è necessario utilizzare un array, è possibile preimpostarlo nella dimensione corretta (ovvero il numero di FileInfo in uso). Quindi, nel ciclo foreach, mantenere un contatore per l'indice dell'array che è necessario aggiornare successivamente.

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;
}

Il mio metodo per unire riceve solo un array di stringhe [], non posso usare un Elenco <>. C'è un modo per risolverlo usando un array?
Sergio Tapia,

1
Utilizzare un Elenco <stringa> e quindi quando è necessario l'array, chiamare il metodo 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
* Add, no add.
bigp,


6

Ecco come aggiungo una stringa quando necessario:

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

Perché non usi un ciclo for invece di usare foreach. In questo scenario, non è possibile ottenere l'indice dell'iterazione corrente del ciclo foreach.

Il nome del file può essere aggiunto alla stringa [] in questo modo,

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;
}

Unico problema: DEVI sapere qual è la tua lunghezza listaDeArchivos. Se non lo fai (ovvero se potrebbe mai cambiare e sarebbe complicato fare un conteggio in anticipo perché i tuoi oggetti sono modelli nidificati o campi modello che potrebbero / potrebbero non essere riempiti, per esempio) e vuoi solo fare string[] Coleccion;quindi assegnalo come int idx = 0; Coleccion[idx] = fileName; idx++;, te lo dirà Use of unassigned local variable 'Coleccion'. Cordiali saluti per chiunque voglia adattare questo per essere più dinamico, che c'è una trappola.
vapcguy,

1

Questo codice funziona alla grande per preparare i valori dinamici Array per spinner in 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

per cancellare l'array e rendere il numero dei suoi elementi = 0 contemporaneamente, usa questo ..

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

0

Non userei un array in questo caso. Invece vorrei usare 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"]

Potrebbe essere una buona idea spiegare perché un array è una cattiva scelta qui e OP dovrebbe usare List <> per cominciare.
LueTm

0

Aggiunta di un riferimento a Linq using System.Linq;e utilizzo del metodo di estensione fornito Append: public static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element) Quindi è necessario riconvertirlo in string[]utilizzando il .ToArray()metodo.

È possibile, in quanto il tipo di string[]attrezzi IEnumerable, implementa anche le seguenti interfacce: IEnumerable<char>, IEnumerable, IComparable, IComparable<String>, IConvertible, IEquatable<String>,ICloneable

using System.Linq;
public string[] descriptionSet new string[] {"yay"};
descriptionSet = descriptionSet.Append("hooray!").ToArray();  
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.