web-dev-qa-db-ja.com

配列を配列にコピー

配列に少し問題があります。私はC#の新人です。

Int配列を他の2つのInt配列にコピーしようとしています

unsortedArray = randomNumbers();

unsortedArray2 = unsortedArray;
unsortedArray3 = unsortedArray;

しかし、unsortedArray2をソートすると、unsortedArray3もソートされます。

誰かが私を助けてくれますか?

13
ARX

Int配列を他の2つのInt配列にコピーしようとしています

最初に重要なことは、この行で:

unsortedArray2 = unsortedArray;

unsortedArrayの値をunsortedArray2にコピーしないでください。 =代入演算子 と呼ばれます

代入演算子(=)は、右側のオペランドの値を格納場所に格納します。

この現象を理解するために知っておく必要がある2番目のことは、C#には2種類のオブジェクトがあることです 参照タイプ と値タイプ

ドキュメントはそれを実際に非常にうまく説明しています:

参照型の変数にはデータ(オブジェクト)への参照が格納されますが、値型の変数には直接データが含まれます。参照型では、2つの変数が同じオブジェクトを参照できます。したがって、1つの変数に対する操作は、他の変数によって参照されるオブジェクトに影響を与える可能性があります。

解決策は Array.Copy メソッドを使用することです。

Array.Copy(unsortedArray, 0, unsortedArray2 , 0, unsortedArray.Length);

CopyTo メソッドもこの場合機能します

unsortedArray.CopyTo(unsortedArray2 , 0);

注:配列のコンテンツが値型であるため、これは機能します!参照タイプでもある場合、いずれかの項目のサブ値を変更すると、宛先配列の同じ項目も変更されます。

9
Mong Zhu

Array.Copyを使用できます。

unsortedArray = randomNumbers();

Array.Copy(unsortedArray, unsortedArray2 , unsortedArray.Length);
Array.Copy(unsortedArray, unsortedArray3 , unsortedArray.Length);
1
user1979643

配列は参照型なので、最初の配列をソートすると、魔法のように2番目の配列がソートされます。これを避けたい場合は、アレイをコピーする必要があります(copyメソッドを使用します)。

0
AlessioR

苦労している問題はC#固有ではありません。動作はどのプログラミング言語(JS/Java/Python/C)でもほとんど同じです。変数unsortedArray2およびunsortedArray3同じメモリのチャンクを指し、配列を並べ替えるときは、このメモリの一部を操作するだけです。

これを念頭に置いて、あなたの目標を達成するために何が必要ですか?配列をコピーする必要があります。それは多くの方法で行うことができます

  1. Array.Copy
  2. 新しい配列を作成してforループで要素を1つずつコピーする
  3. Linq
0
Eduard Lepner