向C#数组添加值


510

这可能是一个非常简单的方法-我从C#开始,需要向数组添加值,例如:

int[] terms;

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

对于那些使用PHP的人,这是我正在C#中尝试做的事情:

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

10
不应该'terms [] = value;' 是“ terms [] =运行;”吗?
tymtam

在C#中,一旦创建,就无法更改数组大小。如果您想要数组之类的东西但能够添加/删除元素,请使用List <int>()。
Kamran Bigdely

Answers:


820

你可以这样-

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循环比List <T>上的foreach循环便宜2倍多,b)数组上的循环比List <T>上的循环便宜2倍,c)循环上使用for的数组比使用foreach在List <T>上循环(我们大多数人这样做)便宜5倍。


1
在这种情况下使用列表有什么好处?
Phill Healey 2014年

9
@PhillHealey在创建阵列之前,您不必“知道”阵列的大小。如您所见,在这些示例中,OP必须在“ new int [400]”中添加一个值-但使用列表,他不必这样做。
Hejner 2014年

3
因为值没有在任何地方定义,所以代码的第一位不是什么。-_-
EasyBB 2015年

1
为什么说ARRAY需要有尺寸???只是做new int[]{}!!!!!
T.Todua

6
@ T.Todua如果您按照建议的方式创建一个空数组,然后尝试访问其不存在的索引来设置值,则OutOfRangeException在运行代码后会得到一个提示。数组需要使用您将要使用的大小进行初始化,它们会在开始时保留所有空间,它使它们非常快,但无法调整大小。
KinSlayerUY

85

如果您使用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);

65

使用Linq的方法Concat可以简化此过程

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

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

结果3,4,2


12
该方法将向数组中添加400个项目,以多一个空间创建数组的副本,并将所有元素移至新数组400次。因此不建议您明智地使用性能。
KinSlayerUY

39

这里提供了如何使用数组的答案。

但是,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);
}

用于检索列表元素:int a = list [i];
Behzad

10

正如其他人所描述的那样,将List用作中介是最简单的方法,但是由于您的输入是一个数组,并且您不只是想将数据保存在List中,所以我想您可能会担心性能。

最有效的方法可能是分配一个新数组,然后使用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;
}

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


2
在性能上更好的做法是创建一个列表,将其填满,然后最后将此副本复制到数组中,这样就不会
重复

10

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

这允许在数组中添加多个项,或者仅将数组作为参数传递以连接两个数组。


8

您必须先分配数组:

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

5
int ArraySize = 400;

int[] terms = new int[ArraySize];


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

    terms[runs] = runs;

}

那就是我编写代码的方式。


3

C#数组是固定长度的,并且总是索引的。使用Motti的解决方案:

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

请注意,此数组是一个密集数组,是一个400字节的连续块,您可以在其中放置东西。如果要动态调整大小的数组,请使用List <int>。

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

int []和List <int>都不是关联数组-在C#中将是Dictionary <>。数组和列表都是密集的。


2
int[] terms = new int[10]; //create 10 empty index in array terms

//fill value = 400 for every index (run) in the array
//terms.Length is the total length of the array, it is equal to 10 in this case 
for (int run = 0; run < terms.Length; run++) 
{
    terms[run] = 400;
}

//print value from each of the index
for (int run = 0; run < terms.Length; run++)
{
    Console.WriteLine("Value in index {0}:\t{1}",run, terms[run]);
}

Console.ReadLine();

/ *输出:

索引0的
值:400 索引1的
值:400 索引2的
值: 索引3的
值:400 索引4的
值:400 索引5的
值:400 索引6的
值:400 索引7的
值:400 索引8:400
索引9中的值:400
* /


您能解释一下这种解决方案吗?
2013年

符文,我刚刚在源代码中添加了注释>希望它可以回答您的问题。
jhyap

2

您不能只是轻松地将元素添加到数组。您可以将元素设置为给定的falling888概述的给定位置,但是我建议使用a List<int>或a Collection<int>代替,ToArray()如果需要将其转换为数组,请使用。


2

如果您确实需要数组,那么以下可能是最简单的:

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();

2

我将其添加为另一个变体。我更喜欢这种类型的功能代码行。

Enumerable.Range(0, 400).Select(x => x).ToArray();

1

如果您不知道数组的大小,或者已经有要添加的现有数组。您可以通过两种方式解决此问题。第一种是使用泛型List<T>:为此,您需要将数组转换为a var termsList = terms.ToList();并使用Add方法。然后,使用该var terms = termsList.ToArray();方法将其转换回数组。

var terms = default(int[]);
var termsList = terms == null ? new List<int>() : terms.ToList();

for(var i = 0; i < 400; i++)
    termsList.Add(i);

terms = termsList.ToArray();

第二种方法是调整当前数组的大小:

var terms = default(int[]);

for(var i = 0; i < 400; i++)
{
    if(terms == null)
        terms = new int[1];
    else    
        Array.Resize<int>(ref terms, terms.Length + 1);

    terms[terms.Length - 1] = i;
}

如果您使用的是.NET 3.5 Array.Add(...);

这两种方法都可以让您动态地进行操作。如果您要添加很多项目,则只需使用即可List<T>。如果只是几个项目,那么调整数组大小将具有更好的性能。这是因为创建List<T>对象需要更多的努力。

时代 在蜱:

3项

数组大小调整时间:6

列表添加时间:16

400项目

数组大小调整时间:305

列表添加时间:20


1

只是一种不同的方法:

int runs = 0; 
bool batting = true; 
string scorecard;

while (batting = runs < 400)
    scorecard += "!" + runs++;

return scorecard.Split("!");

3
虽然有点新颖,但它执行了大量的字符串连接,然后执行了大的枚举操作!不是执行此操作的性能最高或易于理解/可读的方法。
BradleyDotNET

@Ali Humayun您真的打算使用赋值运算符=而不是比较运算符吗?您可以省略争斗变量,并用于runs < 400控制循环。
史蒂夫

只是练习编程的双重诱惑
Ali Humayun

1

一种方法是通过LINQ填充数组

如果您想用一个元素填充数组,您可以简单地编写

string[] arrayToBeFilled;
arrayToBeFilled= arrayToBeFilled.Append("str").ToArray();

此外,如果要用多个元素填充数组,则可以在循环中使用前面的代码

//the array you want to fill values in
string[] arrayToBeFilled;
//list of values that you want to fill inside an array
List<string> listToFill = new List<string> { "a1", "a2", "a3" };
//looping through list to start filling the array

foreach (string str in listToFill){
// here are the LINQ extensions
arrayToBeFilled= arrayToBeFilled.Append(str).ToArray();
}


0
         static void Main(string[] args)
        {
            int[] arrayname = new int[5];/*arrayname is an array of 5 integer [5] mean in array [0],[1],[2],[3],[4],[5] because array starts with zero*/
            int i, j;


          /*initialize elements of array arrayname*/
            for (i = 0; i < 5; i++)
            {
                arrayname[i] = i + 100;
            }

             /*output each array element value*/
            for (j = 0; j < 5; j++)
            {
                Console.WriteLine("Element and output value [{0}]={1}",j,arrayname[j]);
            }
            Console.ReadKey();/*Obtains the next character or function key pressed by the user.
                                The pressed key is displayed in the console window.*/
        }

0
            /*arrayname is an array of 5 integer*/
            int[] arrayname = new int[5];
            int i, j;
            /*initialize elements of array arrayname*/
            for (i = 0; i < 5; i++)
            {
                arrayname[i] = i + 100;
            }

0

使用C#将列表值添加到字符串数组而不使用ToArray()方法

        List<string> list = new List<string>();
        list.Add("one");
        list.Add("two");
        list.Add("three");
        list.Add("four");
        list.Add("five");
        string[] values = new string[list.Count];//assigning the count for array
        for(int i=0;i<list.Count;i++)
        {
            values[i] = list[i].ToString();
        }

值数组的输出包含:

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.