Jak dodać ciąg do tablicy string []? Nie ma funkcji .Dodaj


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

Chciałbym przekonwertować FI.Nameciąg na, a następnie dodać go do mojej tablicy. W jaki sposób mogę to zrobić?

Odpowiedzi:


393

Nie można dodawać elementów do tablicy, ponieważ ma ona stałą długość. To, czego szukasz List<string>, można później przekształcić w tablicę za pomocą list.ToArray()np

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

3
+1 Idę dalej i podam link do mojej odpowiedzi na ten temat. stackoverflow.com/questions/1168915/…
Sam Harwell

2
„Nie możesz dodawać elementów do tablicy” - w rzeczywistości możesz, patrz poniżej.
Alex Strickland,

112

Alternatywnie możesz zmienić rozmiar tablicy.

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

6
Array.Resize to właściwy sposób zmiany rozmiaru tablicy. Jeśli dodasz komentarz przed fragmentem kodu, mówiąc, że rzadko jest to najlepszy sposób radzenia sobie z sytuacjami, w których tablica reprezentuje kolekcję o zmiennym rozmiarze, masz +1. :)
Sam Harwell

12
W rzeczywistości jest to (jedyna) odpowiedź, która dokładnie rozwiązuje pytanie OP.
dialex,

66

Użyj List <T> z System.Collections.Generic

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



myCollection.Add(aString);

Lub stenografia (przy użyciu inicjatora kolekcji):

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

Jeśli naprawdę chcesz tablicy na końcu, użyj

myCollection.ToArray();

Lepiej wyodrębnij interfejs, taki jak IEnumerable, niż zwróć kolekcję.

Edycja: Jeśli musisz użyć tablicy, możesz wstępnie przydzielić ją do odpowiedniego rozmiaru (tj. Liczby posiadanych FileInfo). Następnie w pętli foreach utrzymuj licznik indeksu tablicy, który musisz zaktualizować w następnej kolejności.

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

Moja metoda dołączania odbiera tylko tablicę string [], nie mogę użyć List <>. Czy mogę rozwiązać ten problem za pomocą macierzy?
Sergio Tapia,

1
Użyj List <łańcuch>, a następnie, gdy potrzebujesz tablicy, wywołaj metodę ToArray
Chris Dunaway

30

łatwy

// 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
* Addnie add.
bigp


6

Oto jak dodaję ciąg, gdy jest to potrzebne:

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

Dlaczego nie użyjesz pętli for zamiast użycia foreach. W tym scenariuszu nie ma możliwości uzyskania indeksu bieżącej iteracji pętli foreach.

Nazwę pliku można dodać do ciągu [] w ten sposób,

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

Jedyny problem: MUSISZ wiedzieć, jaka jest twoja długość listaDeArchivos. Jeśli tego nie zrobisz (tj. Jeśli to się kiedykolwiek zmieni i byłoby skomplikowane, aby zliczyć z wyprzedzeniem, ponieważ twoje obiekty są modelami zagnieżdżonymi lub polami modelu, które mogą / mogą nie być wypełnione, na przykład) i po prostu chcesz to zrobić string[] Coleccion;następnie przypisz to tak int idx = 0; Coleccion[idx] = fileName; idx++;, to ci powie Use of unassigned local variable 'Coleccion'. Tylko do Twojej wiadomości dla każdego, kto chce to dostosować, aby był bardziej dynamiczny, że istnieje pułapka.
vapcguy

1

Ten kod świetnie nadaje się do przygotowywania wartości dynamicznych Array for spinner w Androidzie:

    List<String> yearStringList = new ArrayList<>();
    yearStringList.add("2017");
    yearStringList.add("2018");
    yearStringList.add("2019");


    String[] yearStringArray = (String[]) yearStringList.toArray(new String[yearStringList.size()]);

1

aby wyczyścić tablicę i jednocześnie ustawić liczbę jej elementów = 0, użyj tego ..

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

0

W tym przypadku nie użyłbym tablicy. Zamiast tego użyłbym 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"]

Dobrym pomysłem może być wyjaśnienie, dlaczego tablica jest tutaj złym wyborem, a OP powinien zacząć od List <>.
LueTm

0

Dodając referencję do Linq using System.Linq;i użyj dostarczonej metody rozszerzenia Append: public static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element) Następnie musisz przekonwertować ją z powrotem string[]na .ToArray()metodę.

Jest to możliwe, ponieważ typ string[]narzędzi IEnumerable, realizuje również następujące interfejsy: IEnumerable<char>, IEnumerable, IComparable, IComparable<String>, IConvertible, IEquatable<String>,ICloneable

using System.Linq;
public string[] descriptionSet new string[] {"yay"};
descriptionSet = descriptionSet.Append("hooray!").ToArray();  
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.