Как добавить строку в массив string []? Там нет. Добавить функцию


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

Я хотел бы преобразовать в FI.Nameстроку, а затем добавить его в мой массив. Как я могу это сделать?

Ответы:


395

Вы не можете добавлять элементы в массив, так как он имеет фиксированную длину. То, что вы ищете, это List<string>, который позже можно превратить в массив с помощью list.ToArray(), например,

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

3
+1 Я пойду дальше и предложу ссылку на мой ответ на эту тему. stackoverflow.com/questions/1168915/…
Сэм Харвелл

2
«Вы не можете добавлять элементы в массив» - на самом деле вы можете, см. Ниже.
Алекс Стрикленд

112

Кроме того, вы можете изменить размер массива.

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

6
Array.Resize это правильный способ изменить размер массива. Если вы добавите комментарий перед фрагментом кода, говоря, что это редко лучший способ справиться с ситуациями, когда массив представляет коллекцию с изменяемым размером, вы получаете +1. :)
Сэм Харвелл

12
На самом деле, это единственный ответ, который точно решает вопрос ОП.
dialex

66

Использовать список <T> из System.Collections.Generic

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



myCollection.Add(aString);

Или сокращение (используя инициализатор коллекции):

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

Если вам действительно нужен массив в конце, используйте

myCollection.ToArray();

Возможно, вам лучше абстрагироваться от интерфейса, такого как IEnumerable, а затем просто вернуть коллекцию.

Редактировать: если вам нужно использовать массив, вы можете предварительно выделить его до нужного размера (то есть количества FileInfo, которое у вас есть). Затем в цикле foreach сохраните счетчик для индекса массива, который необходимо обновить следующим.

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

Мой метод присоединения получает только массив string [], я не могу использовать List <>. Есть ли способ для меня решить эту проблему с помощью массива?
Серхио Тапия

1
Используйте List <string>, а затем, когда вам нужен массив, вызовите метод 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
* Addнет add.
bigp


6

Вот как я могу добавить строку, когда это необходимо:

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

Почему бы вам не использовать цикл for вместо foreach. В этом случае нет способа получить индекс текущей итерации цикла foreach.

Таким образом, имя файла может быть добавлено в строку [],

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

Единственная проблема: вы ДОЛЖНЫ знать, какова ваша длина listaDeArchivos. Если вы этого не сделаете (то есть, если это когда-либо может измениться, и будет сложно сделать подсчет заранее, потому что ваши объекты являются вложенными моделями или полями модели, которые могут / не могут быть заполнены, например), и вы просто хотите сделать string[] Coleccion;затем назначьте его так int idx = 0; Coleccion[idx] = fileName; idx++;, как он вам скажет Use of unassigned local variable 'Coleccion'. Просто FYI для тех, кто хочет адаптировать это, чтобы быть более динамичным, что есть ловушка.
vapcguy

1

Этот код отлично подходит для подготовки динамических значений Array для spinner в 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

чтобы очистить массив и сделать количество его элементов = 0 одновременно, используйте это ..

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

0

Я бы не использовал массив в этом случае. Вместо этого я бы использовал 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"]

Это может быть хорошей идеей объяснить, почему массив является плохим выбором, и OP должен использовать List <> для начала.
LueTm

0

Добавьте ссылку на Linq using System.Linq;и используйте предоставленный метод расширения Append: public static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element) Затем вам необходимо преобразовать его обратно string[]в .ToArray()метод.

Это возможно потому, что тип string[]орудий IEnumerable, он также реализует следующие интерфейсы: IEnumerable<char>, IEnumerable, IComparable, IComparable<String>, IConvertible, IEquatable<String>,ICloneable

using System.Linq;
public string[] descriptionSet new string[] {"yay"};
descriptionSet = descriptionSet.Append("hooray!").ToArray();  
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.