Wie füge ich einem String [] Array einen String hinzu? Es gibt keine .Add-Funktion


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

Ich möchte das FI.Namein eine Zeichenfolge konvertieren und es dann meinem Array hinzufügen. Wie kann ich das machen?

Antworten:


395

Sie können einem Array keine Elemente hinzufügen, da es eine feste Länge hat. Was Sie suchen, ist ein List<string>, das später mit list.ToArray()z

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

3
+1 Ich werde einen Link zu meiner Antwort zu diesem Thema anbieten. stackoverflow.com/questions/1168915/…
Sam Harwell

2
"Sie können einem Array keine Elemente hinzufügen" - tatsächlich können Sie dies, siehe unten.
Alex Strickland

112

Alternativ können Sie die Größe des Arrays ändern.

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

6
Array.Resize ist der richtige Weg, um die Größe eines Arrays zu ändern. Wenn Sie vor dem Code-Snippet einen Kommentar hinzufügen, der besagt, dass dies selten der beste Weg ist, um Situationen zu behandeln, in denen das Array eine Sammlung mit veränderbarer Größe darstellt, haben Sie eine +1. :)
Sam Harwell

12
Tatsächlich ist dies die (einzige) Antwort, die die OP-Frage genau löst.
Dialex

66

Verwenden Sie List <T> aus System.Collections.Generic

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



myCollection.Add(aString);

Oder Kurzform (mit Sammlungsinitialisierer):

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

Wenn Sie am Ende wirklich ein Array möchten, verwenden Sie

myCollection.ToArray();

Möglicherweise ist es besser, zu einer Schnittstelle wie IEnumerable zu abstrahieren, als nur die Sammlung zurückzugeben.

Edit: Wenn Sie müssen ein Array verwenden, können Sie es auf die richtige Größe preallocate (dh die Anzahl der Fileinfo Sie haben). Verwalten Sie dann in der foreach-Schleife einen Zähler für den Array-Index, den Sie als Nächstes aktualisieren müssen.

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

Meine Methode zum Verbinden erhält nur ein Array string []. Ich kann keine Liste <> verwenden. Gibt es eine Möglichkeit für mich, dies mit einem Array zu lösen?
Sergio Tapia

1
Verwenden Sie eine List <string> und rufen Sie dann, wenn Sie das Array benötigen, die ToArray-Methode auf
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
* Addnicht add.
Bigp

9

Wenn ich mich nicht irre, ist es:

MyArray.SetValue(ArrayElement, PositionInArray)

6

So füge ich bei Bedarf einen String hinzu:

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

Warum verwenden Sie nicht eine for-Schleife anstelle von foreach? In diesem Szenario können Sie den Index der aktuellen Iteration der foreach-Schleife nicht abrufen.

Der Name der Datei kann auf diese Weise zur Zeichenfolge [] hinzugefügt werden.

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

Einziges Problem: Sie MÜSSEN wissen, wie lang Sie listaDeArchivossind. Wenn Sie dies nicht tun (dh wenn es sich jemals ändern könnte und es komplex wäre, eine Zählung im Voraus durchzuführen, da Ihre Objekte beispielsweise verschachtelte Modelle oder Modellfelder sind, die möglicherweise nicht gefüllt sind), und Sie dies einfach tun möchten string[] Coleccion;dann ordne es wie zu int idx = 0; Coleccion[idx] = fileName; idx++;, es wird dir sagen Use of unassigned local variable 'Coleccion'. Nur zu Ihrer Information für alle, die dies anpassen möchten, um dynamischer zu sein, dass es eine Falle gibt.
Vapcguy

1

Dieser Code eignet sich hervorragend zum Vorbereiten des Arrays für dynamische Werte für 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

Verwenden Sie diese Option, um das Array zu löschen und gleichzeitig die Anzahl seiner Elemente auf 0 zu setzen.

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

0

Ich würde in diesem Fall kein Array verwenden. Stattdessen würde ich eine StringCollection verwenden.

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

Es könnte eine gute Idee sein, zu erklären, warum ein Array hier eine schlechte Wahl ist und OP zunächst List <> verwenden sollte.
LueTm

0

Hinzufügen eines Verweises auf Linq using System.Linq;und Verwenden der bereitgestellten Erweiterungsmethode Append: public static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element) Anschließend müssen Sie ihn wieder in die string[]Verwendung der .ToArray()Methode konvertieren .

Es ist möglich, weil die Art string[]implementiert IEnumerable, ist es auch folgende Schnittstellen implementiert: IEnumerable<char>, IEnumerable, IComparable, IComparable<String>, IConvertible, IEquatable<String>,ICloneable

using System.Linq;
public string[] descriptionSet new string[] {"yay"};
descriptionSet = descriptionSet.Append("hooray!").ToArray();  
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.