¿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?

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();

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

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

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();

2
* Addno add.
bigp


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

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

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

Ú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()]);

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

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

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

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();  
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.