ChatGPT解决这个技术问题 Extra ChatGPT

向 C# 数组添加值

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

int[] terms;

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

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

$arr = array();
for ($i = 0; $i < 10; $i++) {
    $arr[] = $i;
}
不应该'terms [] = value;'是“条款[] = 运行;”?
在 C# 中,一旦创建数组,就无法更改其大小。如果您想要类似数组但能够添加/删除元素,请使用 List()。
@KamranBigdely 并非如此,您可以将数组用作 IList<> 并使用 LinQ 重新分配值(使用 System.Linq): terms= terms.Append(21).ToArray();
@Leandro:实际上每次运行它时都会创建一个新数组-> terms= terms.Append(21).ToArray();
是的,并在分配中销毁,那又如何?

C
Community

你可以这样做 -

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) for loops on List<T> are a bit more than 2 times cheaper than foreach loops on List<T>, b) Looping on array is around 2 times cheaper than looping on List<T>, c) looping on array using for is 5 times cheaper than looping on List<T> using foreach (which most of us do).


在这种情况下使用列表有什么好处?
@PhillHealey 在创建数组之前,您不必“知道”数组可能会变得多大。如您所见,在这些示例中,OP 必须在“new int[400]”中输入一个值——但对于列表,他不必这样做。
因为值没有在任何地方定义,所以代码的第一位不是什么都不是。 -_-
为什么你说 ARRAY 需要有大小???就做new int[]{} !!!!!!
@T.Todua 如果您像建议的那样创建一个空数组,然后尝试访问它不存在的索引来设置值,您将在运行代码后立即获得一个 OutOfRangeException 。数组需要使用您要使用的大小进行初始化,它们在开始时保留所有空间,女巫使它们非常快,但无法调整它们的大小。
J
John Cummings

使用 Linq 的方法 Concat 使这变得简单

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

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

结果 3,4,2


该方法将使向数组中添加 400 个项目创建一个具有更多空间的数组副本,并将所有元素移动到新数组中,40000 次。所以不建议性能明智。
A
Amanda Mitchell

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

F
FlySwat

此处提供了有关如何使用数组执行此操作的答案。

但是,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];
这不是对所问问题的回答。 OP 很清楚地询问了数组,而不是列表。
L
Leandro Bardelli

到 2019 年,您可以在一行中使用 AppendPrependLinQ

using System.Linq;

接着:

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

使用 List<> 通常是一个更好的主意,但如果真的想使用数组,这是最简单的方法!
@XouDo 100% 同意
+1,但如果您非常关心性能,请不要使用 Linq,如果您想要更短更好的可读性和可维护性代码,请使用它。
@volkit 为了提高性能,您必须使用数组,而不是列表。
K
Karolis

正如其他人所描述的那样,使用 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;
}

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


创建一个列表,将其填满,然后将此复制到数组中,这样会更好,性能明智,因此您不会创建和复制数组超过 400 次
M
Mark

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

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


M
Motti

您必须先分配数组:

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

J
JB King
int ArraySize = 400;

int[] terms = new int[ArraySize];


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

    terms[runs] = runs;

}

这就是我编码的方式。


P
Peter Mortensen

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

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

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

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

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


A
AlexB

您不能轻松地将元素添加到数组中。您可以将元素设置在给定位置,如 fallen888 所述,但我建议改用 List<int>Collection<int>,如果需要将其转换为数组,请使用 ToArray()


S
Steve

如果你真的需要一个数组,下面可能是最简单的:

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

v
vulcan raven
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 中的值:400 索引 3 中的值:400 索引 4 中的值:400 索引 5 中的值:400 索引 6 中的值:400 索引 7 中的值: 400 索引 8 中的值:400 索引 9 中的值:400 */


你能解释一下这个解决方案吗?
Rune,我刚刚在源代码中包含了评论>希望它可以回答你的问题。
D
David

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

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

S
Safi Habhab

一种方法是通过 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();
}


M
Manar Gul

你不能直接这样做。但是,您可以使用 Linq 来执行此操作:

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

如果数组项在开始时不是空的,您可以先将其转换为 List 然后再执行您的 stuf。喜欢:

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

注意:不要错过添加“使用 System.Linq;”在文件的开头。


P
Phillip Brandon Holmes

这对我来说似乎少了很多麻烦:

var usageList = usageArray.ToList();
usageList.Add("newstuff");
usageArray = usageList.ToArray();

C
Community

如果您不知道数组的大小或已有要添加的数组。你可以通过两种方式来解决这个问题。第一种是使用通用 List<T>:为此,您需要将数组转换为 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


M
Micha Wiedenmann

只是一种不同的方法:

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

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

return scorecard.Split("!");

虽然有点新奇,但这是执行大量字符串连接,然后执行大量枚举操作!这不是最高效或易于理解/可读的方式。
@Ali Humayun 你真的打算使用赋值运算符 = 而不是比较运算符吗?您可以省略战斗变量并使用 runs < 400 来控制循环。
只是练习编程双关语
L
Leandro Bardelli

Array Push Example

public void ArrayPush<T>(ref T[] table, object value)
{
    Array.Resize(ref table, table.Length + 1); // Resizing the array for the cloned length (+-) (+1)
    table.SetValue(value, table.Length - 1); // Setting the value for the new element
}

J
Johnno Nolan
int[] terms = new int[400];

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

u
user3404904
         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.*/
        }

u
user3404904
            /*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;
            }

M
Maghalakshmi Saravana

使用 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();
        }

值数组的输出包含:


L
Leandro Bardelli

你可以通过一个列表来做到这一点。这里是如何

List<string> info = new List<string>();
info.Add("finally worked");

如果您需要返回此数组,请执行

return info.ToArray();

t
theAccountant.py

这是处理向 Array 添加新数字和字符串的一种方法:

int[] ids = new int[10];
ids[0] = 1;
string[] names = new string[10];

do
{
    for (int i = 0; i < names.Length; i++)
    {
        Console.WriteLine("Enter Name");
        names[i] = Convert.ToString(Console.ReadLine());
        Console.WriteLine($"The Name is: {names[i]}");
        Console.WriteLine($"the index of name is: {i}");
        Console.WriteLine("Enter ID");
        ids[i] = Convert.ToInt32(Console.ReadLine());
        Console.WriteLine($"The number is: {ids[i]}");
        Console.WriteLine($"the index is: {i}");
    }


} while (names.Length <= 10);

有多种方法可以将不同的内容添加到列表中。但问题是专门说明 Array