我试图在通过Random类生成的2个完全相似的数组(数字和数字2)上进行2种不同的排序算法。我声明了我的2个数组并用Random.NextBytes填充它们。
之后,我在数字上执行我的第一个算法,然后在 numbers2 上进行第二次算法。
但是我注意到 numbers2 似乎只是指向数字的指针,因为当我想对数字2进行排序时,它已经被排序了。
如何使用与数字完全相同的数字填充数字2?我是否需要手动使用 for 循环?谢谢!
class FillArray
{
public byte[] numbers;
public byte[] numbers2;
//instantiate MS Random object
Random Generator = new Random();
//Constructor which takes array size
public FillArray(int amountx)
{
numbers = new byte[amountx]
Generator.NextBytes(numbers);
numbers2 = new byte[amountx];
numbers2 = numbers;
amount = amountx;
}
答案 0 :(得分:6)
数组是引用类型,因此如果要克隆数组,则需要通过Array.Copy复制它。
int[] first = new int[] { 1, 2, 3, 4, 5 };
int[] second = new int[first.Length];
Array.Copy( first, second, first.Length );
first[0] = 10;
// prints 10
Console.WriteLine( first[0] );
// prints 1
Console.WriteLine( second[0] );
您也可以使用Array.CopyTo。如果您没有预先存在的数组,您也可以使用Clone()
方法创建一个包含所有元素的浅层副本的新方法。
答案 1 :(得分:2)
试
numbers2 = (byte[])numbers.Clone();
而不是
numbers2 = new byte[amountx];
numbers2 = numbers;
答案 2 :(得分:1)
使用Array.Copy方法:Array.Copy Method
int[] source = new int[5];
source[0] = 1;
source[1] = 2;
source[2] = 3;
source[3] = 4;
source[4] = 5;
int[] target = new int[5];
Array.Copy(source, target, 5);
答案 3 :(得分:1)
您正在将数字的引用分配给numbers2而不是值。试试这个:
public FillArray(int amountx)
{
numbers = new byte[amountx]
Generator.NextBytes(numbers);
numbers2 = new byte[amountx];
Array.Copy(numbers, numbers2, amountx);
amount = amountx;
}
答案 4 :(得分:1)
由于数组是引用类型,因此您需要创建数组的克隆:
class FillArray
{
public byte[] numbers;
public byte[] numbers2;
//instantiate MS Random object
Random Generator = new Random();
//Constructor which takes array size
public FillArray(int amountx)
{
numbers = new byte[amountx]
Generator.NextBytes(numbers);
numbers2 = new byte[amountx];
// Array Copy solution
Array.CopyTo(numbers2, 0);
// Or a LINQ solution
numbers2 = numbers.ToArray();
// Or a Clone solution
numbers2 = (byte[])numbers.Clone();
amount = amountx;
}
}
答案 5 :(得分:1)
正如Ed所说,数组是引用类型。您的错误如下:
public FillArray(int amountx)
{
numbers = new byte[amountx]
Generator.NextBytes(numbers);
numbers2 = new byte[amountx];
numbers2 = numbers; // this line is why the arrays are the same
amount = amountx;
}
但是,我提供的解决方案与其他2解决方案不同。如果包含System.Linq命名空间,则可以使用.ToList()和.ToArray():
public FillArray(int amountx)
{
numbers = new byte[amountx]
Generator.NextBytes(numbers);
numbers2 = numbers.ToList().ToArray();
amount = amountx;
}
然后,您将拥有2个独立的阵列副本以进行独立排序。