Copy Arrays to Array
I have a little problem with arrays. I am new in C#.
I try to copy an int
array into two other int
arrays with
unsortedArray = randomNumbers();
unsortedArray2 = unsortedArray;
unsortedArray3 = unsortedArray;
But, if I sort the unsortedArray2
, the unsortedArray3
is sorted too.
Can someone help me?
I try to copy a Int Array into 2 other Int Arrays with
The first thing that is important is that in this line :
unsortedArray2 = unsortedArray;
you do not copy the values of the unsortedArray
into unsortedArray2
. The =
is called the assignment operator
The assignment operator (=) stores the value of its right-hand operand in the storage location,
Now the second thing that you need to know to understand this phenomenon is that there are 2 types of objects in C# Reference Types and Value types
The documentation explains it actually quite nicely:
Variables of reference types store references to their data (objects), while variables of value types directly contain their data. With reference types, two variables can reference the same object; therefore, operations on one variable can affect the object referenced by the other variable.
The solution can be to use the Array.Copy method.
Array.Copy(unsortedArray, 0, unsortedArray2 , 0, unsortedArray.Length);
The CopyTo method would also work in this case
unsortedArray.CopyTo(unsortedArray2 , 0);
Note:this will work because the content of the array is a value type! If it would be also of reference type, changing a sub value of one of the items would lead also to a change in the same item in the destination array.
The problem which you are struggling is not C# specific. The behavior will be the same almost in any programming language (JS/Java/Python/C). Variables unsortedArray2
and unsortedArray3
point to the same chunk of memory and when you reorder array you just manipulate with this memory piece.
Having this in mind, what do we need to achieve your goal? We need to copy array. It can be done in many ways
- Array.Copy
Array.Copy(unsortedArray, 0, unsortedArray2 , 0, unsortedArray.Length);
// The CopyTo method would also work in this case
unsortedArray.CopyTo(unsortedArray2 , 0);
- Creating new array and copy elements one by one in for loop
var unsortedArray2 = new int[unsortedArray.Length];
for (int i = 0; i < unsortedArray.Length; i++)
{
unsortedArray2[i] = unsortedArray[i];
}
- Linq
var unsortedArray2 = unsortedArray.Clone();
Note: These operations are shallow copy which would work in your case because the contents are value types, not reference types.
You can use Array.Copy:
unsortedArray = randomNumbers();
Array.Copy(unsortedArray, unsortedArray2 , unsortedArray.Length);
Array.Copy(unsortedArray, unsortedArray3 , unsortedArray.Length);