向 C# 数组添加值

705

这可能是一个非常简单的问题 - 我刚开始学习C#,需要向数组中添加值,例如:

int[] terms;

for(int runs = 0; runs < 400; runs++)
{
    terms[] = runs;
}

如果您使用过PHP,这是我在C#中想要做的事情:

$arr = array();
for ($i = 0; $i < 10; $i++) {
    $arr[] = $i;
}

11
“terms[] = value;” 应该改为 “terms[] = runs;” 吗? - tymtam
在C#中,一旦创建了数组,就无法更改其大小。如果您想要类似于数组的东西,但可以添加/删除元素,请使用List<int>()。 - Kamran Bigdely
@KamranBigdely 不太准确,您可以将数组用作IList<>并使用LinQ重新分配值(using System.Linq):terms= terms.Append (21) .ToArray(); - Leandro Bardelli
1
@Leandro:每次运行时,您实际上都在创建一个新数组 --> terms = terms.Append(21).ToArray(); - Kamran Bigdely
是的,在分配时销毁,那又怎样? - Leandro Bardelli
事实上,PHP中你所熟悉的“数组”并不是计算机科学意义上的真正的数组。真正的数组是一块固定的连续的内存块。当你知道自己有一个真正的数组时,可以进行一些很好的优化,但是PHP实际上提供给你的是一个集合。现在,C#也有像List<int>这样的集合(这是你应该在这里使用的),但是当你请求一个数组时,它实际上会给你一个真正的数组。 - Joel Coehoorn
26个回答

1029

您可以这样做 -

int[] terms = new int[400];
for (int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}

或者,您可以使用列表-使用列表的优点是,在实例化列表时不需要知道数组大小。

List<int> termsList = new List<int>();
for (int runs = 0; runs < 400; runs++)
{
    termsList.Add(value);
}

// You can convert it back to an array if you would like to
int[] terms = termsList.ToArray();

编辑:a) 在List<T>上使用for循环比使用foreach循环节省的时间要多两倍以上,b) 遍历数组比遍历List<T>节省的时间大约是两倍,c) 使用for循环遍历数组比使用foreach循环遍历List<T>节省的时间要多5倍(我们大多数人都使用foreach循环)。


2
在这种情况下使用列表的优势是什么? - Phill Healey
17
在创建数组之前,并不需要知道它可能会有多大。正如你所看到的这些例子中,OP必须将一个值放入"new int[400]"中,但是对于列表,他不必这样做。 - Hejner
1
在这里你需要小心,因为一个列表只是在背后进行动态数组扩展,至少了解容量会很有帮助。 - krystan honour
3
第一行代码不会产生任何结果,因为'value'在任何地方都没有被定义。-_- - EasyBB
14
如果你像@T.Todua建议的那样创建一个空数组,然后尝试访问其不存在的索引以设置值,那么当你运行代码时就会得到一个“超出范围”的异常。数组需要用你要使用的大小进行初始化,它们在开始时就保留了所有空间,这使它们非常快速,但不可能调整大小。 - KinSlayerUY
显示剩余5条评论

156

使用LinqConcat方法可以使这变得简单。

int[] array = new int[] { 3, 4 };

array = array.Concat(new int[] { 2 }).ToArray();

结果 3,4,2


27
此方法将会使得向数组中添加400个元素,每次都需要创建一个新的数组,并将所有元素移动到新数组中,因此从性能上考虑并不推荐。 - KinSlayerUY
并不完全正确,@KinSlayerUY,你可以一次性连接400个元素。 - wilmol

97

如果你正在使用 C# 3,你可以用一行代码来实现:

int[] terms = Enumerable.Range(0, 400).ToArray();

该代码片段假定您在文件顶部使用了System.Linq的using指令。
另一方面,如果您正在寻找可以动态调整大小的东西,正如PHP所显示的那样(我实际上从未学过它),则可能希望使用List而不是int[]。以下是代码的样子:
List<int> terms = Enumerable.Range(0, 400).ToList();

请注意,您不能只通过将terms[400]设置为某个值来添加第401个元素。相反,您需要像这样调用Add()方法:
terms.Add(1337);

64

截至2019年,您可以使用Linq中的AppendPrepend仅用一行代码。

using System.Linq;

然后在NET 6.0中:

terms = terms.Append(21);

或者版本低于.NET 6.0

terms = terms.Append(21).ToArray();

3
一般来说,使用 List<> 更好,但如果想坚持使用数组,这是最简单的方法! - XouDo
@XouDo 100% 同意 - Leandro Bardelli
如果你非常关注性能,那么不要使用Linq,但如果你想要更短、更易读和易于维护的代码,可以使用它。 - volkit
@volkit 为了提高性能,你必须使用数组而不是列表。 - Leandro Bardelli
以下代码对我也有效:terms.Append(21); - Yster
是的,在新版本中也可以不进行转换就能正常工作。 - Leandro Bardelli

43

这里提供了使用数组执行它的答案。但是,C# 有一个非常方便的东西叫做 System.Collections。

集合是使用数组的花哨替代品,尽管其中许多集合在内部使用数组。

例如,C# 有一个称为 List 的集合,其功能与 PHP 数组非常相似。

using System.Collections.Generic;

// Create a List, and it can only contain integers.
List<int> list = new List<int>();

for (int i = 0; i < 400; i++)
{
   list.Add(i);
}

1
用于检索列表元素的代码:int a = list[i]; - Behzad
1
这不是对所问问题的回答。OP 明确询问了数组,而不是列表。 - arkon

14
使用列表作为中介是最简单的方法,正如其他人所描述的那样。但由于您的输入是数组,并且您不仅想将数据保留在列表中,我推测您可能关心性能方面。
最有效的方法可能是分配一个新数组,然后使用Array.Copy或Array.CopyTo。如果您只想将项目添加到列表末尾,这并不难。
public static T[] Add<T>(this T[] target, T item)
{
    if (target == null)
    {
        //TODO: Return null or throw ArgumentNullException;
    }
    T[] result = new T[target.Length + 1];
    target.CopyTo(result, 0);
    result[target.Length] = item;
    return result;
}

如果需要,我还可以发布一种插入扩展方法的代码,该方法将目标索引作为输入。它稍微复杂一些,使用静态方法Array.Copy 1-2次。


3
从性能角度来看,最好创建一个列表,填充它,然后在最后将其复制到数组中,这样您就不需要一遍又一遍地创建和复制数组400次。 - KinSlayerUY
为什么要使用T[] result = new T[target.Length + 1]; target.CopyTo(result, 0);,而不直接使用Array.Resize呢? - EyesShriveledToRaisins

13

基于Thracx的回答(我没有足够的积分来回答):

public static T[] Add<T>(this T[] target, params T[] items)
    {
        // Validate the parameters
        if (target == null) {
            target = new T[] { };
        }
        if (items== null) {
            items = new T[] { };
        }

        // Join the arrays
        T[] result = new T[target.Length + items.Length];
        target.CopyTo(result, 0);
        items.CopyTo(result, target.Length);
        return result;
    }

这可以允许添加多个项目到数组中,或者只需将一个数组作为参数传递以连接两个数组。

10

首先需要分配数组:

int [] terms = new int[400]; // allocate an array of 400 ints
for(int runs = 0; runs < terms.Length; runs++) // Use Length property rather than the 400 magic number again
{
    terms[runs] = value;
}

7
int ArraySize = 400;

int[] terms = new int[ArraySize];


for(int runs = 0; runs < ArraySize; runs++)
{

    terms[runs] = runs;

}

这是我会编写的方式。

5
如果您确实需要一个数组,以下可能是最简单的方法:
using System.Collections.Generic;

// Create a List, and it can only contain integers.
List<int> list = new List<int>();

for (int i = 0; i < 400; i++)
{
   list.Add(i);
}

int [] terms = list.ToArray();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接