Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中的方法中调整数组的大小#_C#_Arrays_Function_Methods - Fatal编程技术网

C# 在c中的方法中调整数组的大小#

C# 在c中的方法中调整数组的大小#,c#,arrays,function,methods,C#,Arrays,Function,Methods,请认为我们有一个名为AddArr的方法,它接受一个数组和几个值,并将这些值添加到数组中 像这样 string[] names = new string[3] { "Parsa", "Nikan", "Neda" }; AddArr(names, "Alex"); foreach (var val in names) { Conso

请认为我们有一个名为AddArr的方法,它接受一个数组和几个值,并将这些值添加到数组中

像这样

        string[] names = new string[3] { "Parsa", "Nikan", "Neda" };
        AddArr(names, "Alex");
        foreach (var val in names)
        {
            Console.WriteLine(val);
        }
        Console.WriteLine(names.Length);
public static void AddArr(ref string[] nums, params string[] n)
        {
            string[] l = new string[nums.Length + n.Length];
            int j;
            for (j = 0; j < nums.Length; j++)
            {
                l[j] = nums[j];
            }
            for (int h = 0; h < n.Length; h++, j++)
            {
                l[j] = n[h];
            }
            Array.Resize(ref nums, l.Length);
            for (int f = 0; f < nums.Length; f++)
            {
                nums[f] = l[f];
            }
        }
c#代码 它只调整字符串[]nums方法的输入参数,而不是调整实际数组的大小,例如,请认为我们有这样一个程序

        string[] names = new string[3] { "Parsa", "Nikan", "Neda" };
        AddArr(names, "Alex");
        foreach (var val in names)
        {
            Console.WriteLine(val);
        }
        Console.WriteLine(names.Length);
public static void AddArr(ref string[] nums, params string[] n)
        {
            string[] l = new string[nums.Length + n.Length];
            int j;
            for (j = 0; j < nums.Length; j++)
            {
                l[j] = nums[j];
            }
            for (int h = 0; h < n.Length; h++, j++)
            {
                l[j] = n[h];
            }
            Array.Resize(ref nums, l.Length);
            for (int f = 0; f < nums.Length; f++)
            {
                nums[f] = l[f];
            }
        }
运行程序后,您可以看到输出是

Parsa
Nikan
Neda
3
Alex名称尚未添加到数组中

如果在方法中设置断点,则在编译方法的第13行nums(方法中的参数)后可以看到该断点,但当编译方法结束时,可以看到名称(数组)没有调整大小,但我可以通过在主方法中编写代码来解决此问题,但我希望在单独的方法中编写此代码,并且不希望使用列表

string[] names = new string[3] { "Parsa", "Nikan", "Neda" };
string[] names2 = new string[1] { "Alex" };

var newArray = new int[names.Length + names2.Length];

names.CopyTo(newArray , 0);
names2.CopyTo(newArray , x.Length);
或者,您可以创建一个方法:

public static string[] AddArr(string[] names, string[] names2)
{
    var newArray = new int[names.Length + names2.Length];

    names.CopyTo(newArray , 0);
    names2.CopyTo(newArray , x.Length);

    return newArray;
}

为了解决这个问题,我们应该像这样使用ref

        string[] names = new string[3] { "Parsa", "Nikan", "Neda" };
        AddArr(names, "Alex");
        foreach (var val in names)
        {
            Console.WriteLine(val);
        }
        Console.WriteLine(names.Length);
public static void AddArr(ref string[] nums, params string[] n)
        {
            string[] l = new string[nums.Length + n.Length];
            int j;
            for (j = 0; j < nums.Length; j++)
            {
                l[j] = nums[j];
            }
            for (int h = 0; h < n.Length; h++, j++)
            {
                l[j] = n[h];
            }
            Array.Resize(ref nums, l.Length);
            for (int f = 0; f < nums.Length; f++)
            {
                nums[f] = l[f];
            }
        }
public static void AddArr(ref string[]nums,params string[]n)
{
字符串[]l=新字符串[nums.Length+n.Length];
int j;
对于(j=0;j
这是问题的答案
感谢Matthew Watson提供此解决方案

您可以修改代码,如下所示:

public static void AddArr(ref string[] nums, params string[] n)
{
    string[] l = new string[nums.Length + n.Length];
    int j;
    for (j = 0; j < nums.Length; j++)
    {
        l[j] = nums[j];
    }
    for (int h = 0; h < n.Length; h++, j++)
    {
        l[j] = n[h];
    }
    Array.Resize(ref nums, l.Length);
    for (int f = 0; f < nums.Length; f++)
    {
        nums[f] = l[f];
    }
现在它将得到正确的结果:

Parsa
Nikan
Neda
Alex
4

您只需要将“names”变量作为引用传递,以便在将其传递给AddArr()函数后更改仍然存在。

缺少的是,要使您的现有代码能够工作,
nums
需要通过引用传递,以便更改(在
数组中。Resize
)向外传播到收集器:

public static void AddArr(ref string[]nums,params string[]n)
{
// ...
}
// ...
AddArr(参考名称,“Alex”);

然而!这是一个糟糕的解决方案。集合或列表类型在各方面都是首选的

您需要声明
string[]nums
参数作为引用:
ref string[]nums
。否则,数组引用的副本将传递给该方法,
array.Resize()
将修改该副本而不是实际引用。您永远无法调整数组的大小;数组的大小根据定义是固定的。最好使用
列表nums
或类似的方法,并调用
nums.Add(…)
(是的,你可以使用类似于
数组。调整大小
,但这个名称是个谎言:它应该被称为
数组。CreateNewArrayWithDifferentsSizeAndCopytheData
)我在文本中说我不想使用lists@ParsaAghasi这就像说“帮我用螺丝刀钉钉子;我在课文中说我不想用锤子”——我的意思是,当然可以,但这并不是一个好的方式things@ParsaAghasi用一种更具建设性的方式重新表述:你不必回答这个问题,但我会非常好奇你为什么要这样做,因为目标听起来可能是基于一些误解。如果是这样的话,最好是纠正错误观念,并使用正确的工具来完成工作,而不是确切地学习如何以艰苦的方式做事method@Zer0赤裸裸的阵列确实可怕;如果你想走这条路——从贸易公司的角度来看,我认为你应该看看租用阵列的跨度,以减少分配;关于它是引用类型的“问题”:数组是引用类型。。。所以再次强调:如果您想全速前进:跨越非托管内存。自定义引用类型集合可以做一些有趣的事情,比如在内部使用数组池,这样即使它们确实调整了大小:分配也会摊销,而不是浪费。细节很重要,但裸数组从来都不是很好,部分原因是精确的长度问题。