如何将字符串添加到string []数组?没有.Add功能


221
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为字符串,然后将其添加到我的数组中。我怎样才能做到这一点?

Answers:


393

您不能将项目添加到数组,因为数组具有固定的长度。您要查找的是一个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。:)
Sam Harwell

12
实际上,这是(唯一)可以完全解决OP问题的答案。
Dialex

66

使用System.Collections.Generic中的List <T>

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

易用

// 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循环当前迭代的索引。

可以通过这种方式将文件名添加到string []中,

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'。仅供参考,对于任何想要使它适应更多动态的人来说,都有陷阱。
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()]);


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

添加对Linq的引用using System.Linq;并使用提供的扩展方法Appendpublic static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element) 然后,您需要将其转换回string[]使用.ToArray()方法。

这是可能的,因为型string[]工具IEnumerable,它也实现了以下接口:IEnumerable<char>IEnumerableIComparableIComparable<String>IConvertibleIEquatable<String>ICloneable

using System.Linq;
public string[] descriptionSet new string[] {"yay"};
descriptionSet = descriptionSet.Append("hooray!").ToArray();  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.