2017-07-14 9 views
1

1つのキー配列に基づいて異なるアイテム配列をソートしようとしています。 「第2」及び「第三」と呼ば配列の並べ替えC#:意図しないキー配列の変更

int[] first = new int[] { 1, 9, 2, 3, 8, 4, 5 }; 
string[] second = new string[] { "one", "nine", "two", "three", "eight", "four", "five" }; 

int[] temp = first; 
Array.Sort(temp, second); 

foreach (int v in temp) 
{ 
    Debug.WriteLine(v.ToString()); 
} 

foreach (string v in second) 
{ 
    Debug.WriteLine(v); 
} 

int[] third = new int[] { 11, 99, 22, 33, 88, 44, 55 }; 

foreach (int v in first) 
{ 
    Debug.WriteLine(v.ToString()); 
} 

Array.Sort(first, third); 

foreach (int v in first) 
{ 
    Debug.WriteLine(v.ToString()); 
} 

foreach (int v in third) 
{ 
    Debug.WriteLine(v); 
} 

アレイは、「最初の」配列の順序に基づいてソートされるべき次の簡単なコードは、私のより複雑なコードを表します。

Array.Sort(first, second) 

別のArray.Sortを追加して「3番目」をソートするまで、これは完全に機能します。私は他のソートアクションのためのキー配列として 'first'を保持したいので、一時的な配列 'temp'を使用して、最初のシーケンスを保存し、毎回再利用できるようにします。 Array.Sort(最初、3番目)を使用して3番目のソートを再利用すると、ソートは機能しません(出力を参照)。最初のArray.Sortの間に 'first'が 'temp'と一緒にソートされているように見えますが、コマンドには含まれていません。

出力:

1 
2 
3 
4 
5 
8 
9 

one 
two 
three 
four 
five 
eight 
nine 

1 //--> 'first' before it is used in Array.Sort, so it seems already sorted 
2 
3 
4 
5 
8 
9 

1 
2 
3 
4 
5 
8 
9 

11 //--> 'third' does not get sorted because 'first' seemed already sorted 
99 
22 
33 
88 
44 
55 

がどのように私はそれを複数回使用できるように、私のキー配列がソートされないことを確認していますか?

+0

public static void Sort(配列キー、配列アイテム); すでにソートされている最初の配列に存在するキーに基づいてソートされます。 – Nilay

+0

@ニレイ:あなたはその質問を読んだことがありますか? –

+0

はい@TimSchmelter、デバッグ配列で最初に既にソートされ、そのメソッドのキーとして使用されているので、アイテム配列をソートしません。 firstArrayをソートして試してみてください。 – Nilay

答えて

3

配列は参照タイプです。変数はのプレースホルダーです。参照型変数に格納されている値は、参照しているオブジェクトのメモリ内の "アドレス"(いわば)です。 1つの参照タイプ変数の値を別の参照タイプ変数に割り当てるときは、変数をコピーしてとするだけです。

これは何と関連がありますか? すべて

int[] temp = first; 

ここの行は、あなたが考えるべきことをしていません。 firstに格納されている値をtempという名前の変数にコピーするだけです。その価値は何でしたか?うん、配列のアドレスは、今のところ、tempfirstは全く同じ配列を指しています;したがって、配列に変更を加えた場合は、配列firstの両方が同じ配列であるため、tempの配列も変更されます。

を作成する必要があります。毎回アレイの新しいコピーをに作成してください。これを行う最も簡単な方法はPablo notPicasso's answerです。

+0

この説明をありがとう! – 10a

3

新しい配列を作成します。

Array.Sort(first.ToArray(), second); 
Array.Sort(first.ToArray(), third); 
+0

私は 'ToArray()'はおそらく(そうではありますが)配列に最適化されると期待しているので、 'first.Clone()'はより良いと思います。 – Chris

+1

@Chris trueですが、「IClonable」は単純にそのような混乱(あなたが決めるべきかどうかはわかりません)です。 'ToArray'はそれが何をしているのかはっきりしています。そうしないとパフォーマンスの理由がない限り、私はこの解決策がより好きです。 – InBetween

+0

@InBetween:すべての有効なポイント。 – Chris

関連する問題