Як додати рядок до масиву string []? Немає функції додавання


223
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рядок, а потім додати його до свого масиву. Як я можу це зробити?

Відповіді:


396

Ви не можете додати елементи до масиву, оскільки він має фіксовану довжину. Те, що ви шукаєте, - це таке 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;
}

Мій метод з'єднання отримує лише рядок [] масиву, я не можу використовувати Список <>. Чи є спосіб я вирішити це за допомогою масиву?
Серхіо Тапія

1
Скористайтеся списком <string>, а тоді, коли вам потрібен масив, зателефонуйте до методу ToArray
Кріс Дунавей

30

Легкий

// 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

Чому б вам не скористатись циклом замість 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

Цей код чудово підходить для підготовки динамічних значень масиву для спінера в 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"]

Можливо, було б непогано пояснити, чому масив - це поганий вибір, і для початку ОП повинен використовувати Список <>.
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.