Bir dize [] dizisine dize nasıl eklenir? Ekleme işlevi yok


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.NameBir dizeye dönüştürmek ve sonra benim diziye eklemek istiyorum. Bunu nasıl yapabilirim?

Yanıtlar:


396

Sabit bir uzunluğa sahip olduğu için bir diziye öğe ekleyemezsiniz. Ne aradığınız bir olduğu List<string>sonradan kullanarak bir diziye açılabilir, hangi list.ToArray(), örneğin

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

3
+1 Devam edip bu konudaki cevabımın bağlantısını sunacağım. stackoverflow.com/questions/1168915/…
Sam Harwell

2
"Bir diziye öğe ekleyemezsiniz" - aslında bunu yapabilirsiniz, aşağıya bakın.
Alex Strickland

112

Alternatif olarak, diziyi yeniden boyutlandırabilirsiniz.

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

6
Array.Resize olan bir dizi yeniden boyutlandırmak için uygun bir yol. Kod pasajından önce bir yorum eklerseniz, dizinin yeniden boyutlandırılabilir bir koleksiyonu temsil ettiği durumlarla başa çıkmak için nadiren en iyi yol +1 olur. :)
Sam Harwell

12
Aslında, OP sorusunu tam olarak çözen (sadece) cevap budur.
dialex

66

System.Collections.Generic içindeki <T> Listesini kullanın

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



myCollection.Add(aString);

Veya, steno (toplama başlatıcı kullanarak):

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

Sonunda gerçekten bir dizi istiyorsanız,

myCollection.ToArray();

IEnumerable gibi bir arabirime soyutlamaktan, daha sonra koleksiyonu geri döndürmekten daha iyi olabilirsiniz.

Düzenleme: Bir dizi kullanmanız gerekiyorsa , onu doğru boyuta (yani sahip olduğunuz FileInfo sayısı) önceden konumlandırabilirsiniz. Ardından, foreach döngüsünde, bir sonraki güncellemeniz gereken dizi dizini için bir sayaç bulundurun.

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

Birleştirme yöntemim sadece bir dize [] dizisi alır, bir Liste <> kullanamıyorum. Bunu bir Array kullanarak çözmem için bir yol var mı?
Sergio Tapia

1
<string> Listesini kullanın ve diziye ihtiyacınız olduğunda ToArray yöntemini çağırın
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
* Adddeğil add.
bigp


6

Bu nasıl gerektiğinde bir dizeye eklemek olduğunu:

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

Neden foreach kullanmak yerine bir for döngüsü kullanmıyorsunuz. Bu senaryoda, foreach döngüsünün geçerli yinelemesinin dizinini almanın bir yolu yoktur.

Dosyanın adı bu şekilde [] dizesine eklenebilir,

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

Tek sorun: uzunluğunun ne olduğunu bilmelisin listaDeArchivos. Bunu yapmazsanız (yani, hiç değişebiliyorsa ve nesneleriniz iç içe geçmiş modeller veya doldurulabilecek / doldurulmayabilecek model alanları olduğu için önceden sayım yapmak karmaşık olacaktır) ve sadece string[] Coleccion;sonra onu atayın int idx = 0; Coleccion[idx] = fileName; idx++;, size söyleyecektir Use of unassigned local variable 'Coleccion'. Bunu daha dinamik hale getirmek isteyen herkes için sadece bir FYI, bir tuzak var.
vapcguy

1

Bu kod, Android'de değer değiştirici için Array dinamik değerlerini hazırlamak için harika çalışıyor:

    List<String> yearStringList = new ArrayList<>();
    yearStringList.add("2017");
    yearStringList.add("2018");
    yearStringList.add("2019");


    String[] yearStringArray = (String[]) yearStringList.toArray(new String[yearStringList.size()]);

1

diziyi temizlemek ve öğelerinin sayısını = 0 yapmak için bunu kullanın,

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

0

Bu durumda bir dizi kullanmazdım. Bunun yerine bir StringCollection kullanırdım.

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

Burada bir dizinin neden kötü bir seçim olduğunu açıklamak iyi bir fikir olabilir ve OP ile başlamak için List <> kullanmalıdır.
LueTm

0

Linq'e bir başvuru ekleme using System.Linq;ve sağlanan uzantı yöntemini kullanma Append: public static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element) Ardından string[],.ToArray() yöntemi .

Bu tip, çünkü mümkündür string[]uygular IEnumerable, aynı zamanda aşağıdaki arabirimleri uygulayan: IEnumerable<char>, IEnumerable, IComparable, IComparable<String>, IConvertible, IEquatable<String>,ICloneable

using System.Linq;
public string[] descriptionSet new string[] {"yay"};
descriptionSet = descriptionSet.Append("hooray!").ToArray();  
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.