¿Cómo agregar una cadena a una matriz de cadena []? No hay función .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;
}

Me gustaría convertirlo FI.Nameen una cadena y luego agregarlo a mi matriz. ¿Cómo puedo hacer esto?

Sergio Tapia
fuente

Respuestas:

395

No puede agregar elementos a una matriz, ya que tiene una longitud fija. Lo que está buscando es un List<string>, que luego puede convertirse en una matriz utilizando list.ToArray(), por ejemplo,

List<string> list = new List<string>();
list.Add("Hi");
String[] str = list.ToArray();
Saulius Valatka
fuente
3
+1 Seguiré adelante y ofreceré un enlace a mi respuesta sobre este tema. stackoverflow.com/questions/1168915/…
Sam Harwell
2
"No se pueden agregar elementos a una matriz", en realidad sí se puede ver a continuación
Alex Strickland
112

Alternativamente, puede cambiar el tamaño de la matriz.

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

fuente
66
Array.Resize es la forma correcta de cambiar el tamaño de una matriz. Si agrega un comentario antes del fragmento de código que dice que rara vez es la mejor manera de manejar situaciones en las que la matriz representa una colección redimensionable, tiene un +1. :)
Sam Harwell
12
En realidad, esta es la (única) respuesta que resuelve exactamente la pregunta OP.
dialex
66

Utilice la Lista <T> de System.Collections.Generic

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



myCollection.Add(aString);

O, taquigrafía (usando el inicializador de colección):

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

Si realmente quieres una matriz al final, usa

myCollection.ToArray();

Puede que sea mejor abstraer a una interfaz, como IEnumerable, y luego simplemente devolver la colección.

Editar: si debe usar una matriz, puede preasignarla al tamaño correcto (es decir, el número de FileInfo que tiene). Luego, en el ciclo foreach, mantenga un contador para el índice de matriz que necesita actualizar a continuación.

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
fuente
Mi método para unirme recibe solo una matriz de cadena [], no puedo usar una Lista <>. ¿Hay alguna manera de resolver esto usando una matriz?
Sergio Tapia
1
Use una Lista <cadena> y luego cuando necesite la matriz, llame al método 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
fuente
2
* Addno add.
bigp
9

Si no me equivoco es:

MyArray.SetValue(ArrayElement, PositionInArray)
Stefan Nicolov
fuente
6

Así es como agrego a una cadena cuando es necesario:

string[] myList;
myList = new string[100];
for (int i = 0; i < 100; i++)
{
    myList[i] = string.Format("List string : {0}", i);
}
Kittugadu
fuente
3
string[] coleccion = Directory.GetFiles(inputPath)
    .Select(x => new FileInfo(x).Name)
    .ToArray();
xcud
fuente
3

¿Por qué no usas un bucle for en lugar de usar foreach? En este escenario, no hay forma de obtener el índice de la iteración actual del bucle foreach.

El nombre del archivo se puede agregar a la cadena [] de esta manera,

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
fuente
Único problema: DEBE saber cuál es su duración listaDeArchivos. Si no lo hace (es decir, si alguna vez podría cambiar y sería complejo hacer un recuento con anticipación porque sus objetos son modelos anidados o campos de modelos que pueden / pueden no rellenarse, por ejemplo) y solo desea hacerlo string[] Coleccion;luego asignarlo como int idx = 0; Coleccion[idx] = fileName; idx++;, te lo dirá Use of unassigned local variable 'Coleccion'. Solo para tu información, para cualquiera que quiera adaptar esto para que sea más dinámico, hay una trampa.
vapcguy
1

Este código funciona muy bien para preparar la matriz de valores dinámicos para spinner en 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
fuente
1

para borrar la matriz y hacer que el número de sus elementos = 0 al mismo tiempo, use esto ...

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

No usaría una matriz en este caso. En cambio, usaría una 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
fuente
0
string[] MyArray = new string[] { "A", "B" };
MyArray = new List<string>(MyArray) { "C" }.ToArray();
//MyArray = ["A", "B", "C"]
Konstantin Lapeev
fuente
Puede ser una buena idea explicar por qué una matriz es una mala elección aquí y OP debería usar List <> para comenzar.
LueTm
0

Agregar una referencia a Linq using System.Linq;y usar el método de extensión proporcionado Append: public static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element) luego debe convertirlo nuevamente para string[]usar el .ToArray()método.

Es posible, porque el tipo de string[]implementos IEnumerable, sino que también pone en práctica las siguientes interfaces: 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
fuente