Làm cách nào để thêm một chuỗi vào một chuỗi []? Không có chức năng .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;
}

Tôi muốn chuyển đổi FI.Namechuỗi thành chuỗi và sau đó thêm nó vào mảng của tôi. Tôi có thể làm cái này như thế nào?

Câu trả lời:


395

Bạn không thể thêm các mục vào một mảng, vì nó có độ dài cố định. Những gì bạn đang tìm kiếm là một List<string>, sau này có thể được chuyển thành một mảng bằng cách sử dụng list.ToArray(), ví dụ:

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

3
+1 Tôi sẽ tiếp tục và cung cấp một liên kết đến câu trả lời của tôi về chủ đề này. stackoverflow.com/questions/1168915/ Mạnh
Sam Harwell

2
"Bạn không thể thêm các mục vào một mảng" - thực sự bạn có thể, xem bên dưới.
Alex Strickland

112

Ngoài ra, bạn có thể thay đổi kích thước mảng.

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

6
Array.Resize cách thích hợp để thay đổi kích thước một mảng. Nếu bạn thêm một nhận xét trước đoạn mã nói rằng đó hiếm khi là cách tốt nhất để xử lý các tình huống trong đó mảng đại diện cho một bộ sưu tập có thể thay đổi kích thước mà bạn có +1. :)
Sam Harwell

12
Trên thực tế, đây là câu trả lời (duy nhất) giải quyết chính xác câu hỏi OP.
dialex 7/11/2015

66

Sử dụng Danh sách <T> từ System.Collections.Generic

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



myCollection.Add(aString);

Hoặc, tốc ký (sử dụng bộ khởi tạo bộ sưu tập):

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

Nếu bạn thực sự muốn một mảng ở cuối, sử dụng

myCollection.ToArray();

Bạn có thể tốt hơn hết là trừu tượng hóa một giao diện, chẳng hạn như IEnumerable, sau đó chỉ cần trả lại bộ sưu tập.

Chỉnh sửa: Nếu bạn phải sử dụng một mảng, bạn có thể phân bổ nó theo đúng kích thước (tức là số lượng FileInfo bạn có). Sau đó, trong vòng lặp foreach, duy trì bộ đếm cho chỉ số mảng bạn cần cập nhật tiếp theo.

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

Phương thức tham gia của tôi chỉ nhận được một chuỗi [], tôi không thể sử dụng Danh sách <>. Có cách nào để tôi giải quyết vấn đề này bằng cách sử dụng Mảng không?
Sergio Tapia

1
Sử dụng Danh sách <chuỗi> và sau đó khi bạn cần mảng, hãy gọi phương thức ToArray
Chris Dunaway

30

dễ

// 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, không phải add.
bigp 17/05/2016

9

Nếu tôi không nhầm thì đó là:

MyArray.SetValue(ArrayElement, PositionInArray)

6

Đây là cách tôi thêm vào một chuỗi khi cần:

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

Tại sao bạn không sử dụng vòng lặp for thay vì sử dụng foreach. Trong kịch bản này, không có cách nào bạn có thể lấy chỉ mục của lần lặp hiện tại của vòng lặp foreach.

Tên của tệp có thể được thêm vào chuỗi [] theo cách này,

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

Vấn đề duy nhất: bạn PHẢI biết chiều dài của bạn listaDeArchivoslà bao nhiêu. Nếu bạn không (nghĩa là nếu nó có thể thay đổi và sẽ rất phức tạp để thực hiện trước thời hạn vì các đối tượng của bạn là các mô hình lồng nhau hoặc các trường mô hình có thể / có thể không được điền vào, chẳng hạn) và bạn chỉ muốn làm string[] Coleccion;sau đó gán nó thích int idx = 0; Coleccion[idx] = fileName; idx++;, nó sẽ cho bạn biết Use of unassigned local variable 'Coleccion'. Chỉ cần FYI cho bất cứ ai muốn điều chỉnh để trở nên năng động hơn, đó là một cạm bẫy.
vapcguy

1

Mã này hoạt động rất tốt để chuẩn bị Mảng giá trị động cho spinner trong 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

để xóa mảng và tạo số lượng phần tử của nó = 0 cùng một lúc, hãy sử dụng ..

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

0

Tôi sẽ không sử dụng một mảng trong trường hợp này. Thay vào đó tôi sẽ sử dụng 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"]

Có thể là một ý tưởng tốt để giải thích tại sao một mảng là một lựa chọn tồi ở đây và OP nên sử dụng Danh sách <> để bắt đầu.
LueTm

0

Thêm một tham chiếu đến Linq using System.Linq;và sử dụng phương thức mở rộng được cung cấp Append: public static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element) Sau đó, bạn cần chuyển đổi nó trở lại string[]sử dụng .ToArray()phương thức.

Có thể, vì các loại string[]dụng cụ IEnumerable, nó cũng thực hiện các giao diện sau: IEnumerable<char>, IEnumerable, IComparable, IComparable<String>, IConvertible, IEquatable<String>,ICloneable

using System.Linq;
public string[] descriptionSet new string[] {"yay"};
descriptionSet = descriptionSet.Append("hooray!").ToArray();  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.