วิธีการเพิ่มสตริงให้กับสตริง [] อาร์เรย์? ไม่มีฟังก์ชั่นเพิ่ม


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

คุณไม่สามารถเพิ่มรายการลงในอาร์เรย์ได้เนื่องจากมีความยาวคงที่ สิ่งที่คุณกำลังมองหาคือ a List<string>ซึ่งสามารถใช้เป็นอาร์เรย์ในภายหลังได้list.ToArray()เช่น

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

3
+1 ฉันจะดำเนินการต่อและเสนอลิงก์ไปยังคำตอบของฉันในเรื่องนี้ stackoverflow.com/questions/1168915/…
Sam Harwell

2
"คุณไม่สามารถเพิ่มรายการลงในอาร์เรย์" - จริง ๆ แล้วคุณสามารถดูด้านล่าง
Alex Strickland

112

หรือคุณสามารถปรับขนาดอาร์เรย์ได้

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

6
Array.Resize เป็นวิธีที่เหมาะสมในการปรับขนาดอาร์เรย์ หากคุณเพิ่มความคิดเห็นก่อนที่โค้ดจะบอกว่าเป็นวิธีที่ดีที่สุดในการจัดการสถานการณ์ที่อาร์เรย์แสดงคอลเลกชันที่ปรับขนาดได้ซึ่งคุณมี +1 :)
Sam Harwell

12
จริงๆแล้วนี่คือคำตอบ (เท่านั้น) ที่แก้ปัญหา OP แน่นอน
dialex

66

ใช้รายการ <T> จาก System.Collections.Generic

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



myCollection.Add(aString);

หรือจดชวเลข (ใช้ initializer การรวบรวม):

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

วิธีการของฉันในการเข้าร่วมรับเฉพาะสตริง [] อาร์เรย์ฉันไม่สามารถใช้รายการ <> มีวิธีสำหรับฉันที่จะแก้ปัญหานี้โดยใช้ Array หรือไม่?
Sergio Tapia

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

ทำไมคุณไม่ใช้ for for loop แทนที่จะใช้ foreach ในสถานการณ์สมมตินี้ไม่มีวิธีที่คุณสามารถรับดัชนีของการวนซ้ำปัจจุบันของ foreach loop ได้

ชื่อของไฟล์สามารถเพิ่มลงในสตริง [] ด้วยวิธีนี้

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 สำหรับ Array สำหรับ 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();  
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.