Como adicionar uma string a uma matriz de string []? Não há função .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;
}

Gostaria de converter o FI.Nameem uma string e adicioná-lo à minha matriz. Como posso fazer isso?

Sergio Tapia
fonte

Respostas:

395

Você não pode adicionar itens a uma matriz, pois ela possui comprimento fixo. O que você está procurando é um List<string>, que depois pode ser transformado em uma matriz usando list.ToArray(), por exemplo,

List<string> list = new List<string>();
list.Add("Hi");
String[] str = list.ToArray();
Saulius Valatka
fonte
3
+1 Vou seguir em frente e oferecer um link para minha resposta sobre esse assunto. stackoverflow.com/questions/1168915/…
Sam Harwell
2
"Você não pode adicionar itens a uma matriz" - na verdade você pode, veja abaixo.
Alex Strickland
112

Como alternativa, você pode redimensionar a matriz.

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

fonte
6
Array.Resize é a maneira correta de redimensionar uma matriz. Se você adicionar um comentário antes do snippet de código, dizendo que raramente é a melhor maneira de lidar com situações em que a matriz representa uma coleção redimensionável e você recebe +1. :)
Sam Harwell
12
Na verdade, esta é a (única) resposta que resolve exatamente a questão do OP.
Dialex '07
66

Use a Lista <T> de System.Collections.Generic

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



myCollection.Add(aString);

Ou, abreviação (usando o inicializador de coleção):

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

Se você realmente deseja uma matriz no final, use

myCollection.ToArray();

É melhor abstrair para uma interface, como IEnumerable, e apenas retornar a coleção.

Editar: se você precisar usar uma matriz, poderá pré-alocá-la no tamanho certo (ou seja, o número de informações de arquivo que você possui). Em seguida, no loop foreach, mantenha um contador para o índice da matriz que você precisa atualizar a seguir.

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
fonte
Meu método para ingressar recebe apenas uma matriz [], não posso usar uma lista <>. Existe uma maneira de resolver isso usando uma matriz?
Sergio Tapia
1
Use um List <string> e, em seguida, quando você precisa do array, chamar o método ToArray
Chris Dunaway
30

facil

// 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
fonte
2
* Addnão add.
Bigp
9

Se não me engano, é:

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

É assim que adiciono uma string quando necessário:

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

Por que você não usa um loop for em vez de usar o foreach. Nesse cenário, não há como obter o índice da iteração atual do loop foreach.

O nome do arquivo pode ser adicionado à string [] dessa maneira,

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
fonte
Único problema: você DEVE saber qual é a sua duração listaDeArchivos. Se você não o fizer (isto é, se alguma vez puder mudar e seria complexo fazer uma contagem antecipada, porque seus objetos são modelos aninhados ou campos de modelos que podem / não podem ser preenchidos, por exemplo) e você só quer fazer string[] Coleccion;em seguida, atribua-o como int idx = 0; Coleccion[idx] = fileName; idx++;, ele dirá a você Use of unassigned local variable 'Coleccion'. Apenas para sua informação, para quem deseja adaptar isso para ser mais dinâmico, há uma armadilha.
vapcguy
1

Esse código funciona muito bem para preparar os valores dinâmicos Array for spinner no 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
fonte
1

para limpar a matriz e tornar o número de elementos = 0 ao mesmo tempo, use isto ..

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

Eu não usaria uma matriz neste caso. Em vez disso, eu usaria um 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
fonte
0
string[] MyArray = new string[] { "A", "B" };
MyArray = new List<string>(MyArray) { "C" }.ToArray();
//MyArray = ["A", "B", "C"]
Konstantin Lapeev
fonte
Pode ser uma boa idéia explicar por que uma matriz é uma má escolha aqui e o OP deve usar a Lista <> para começar.
LueTm
0

Adicionando uma referência ao Linq using System.Linq;e use o método de extensão fornecido Append: public static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element) você precisará convertê-lo novamente para string[]usar o.ToArray() método

É possível, porque o tipo de string[]implementos IEnumerable, também implementa as seguintes 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
fonte