2017-07-14 53 views
1

我想基於一個鍵陣列對不同的項目數組進行排序。以下簡單的代碼表示我的更復雜的代碼:排序數組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排序'第三'。由於我想保留'first'作爲其他排序動作的關鍵數組,因此我使用名爲'temp'的臨時數組來保存'first'的初始序列,以便每次都可以重複使用。當我首先重用也使用Array.Sort(第一,第三)排序'第三'時,排序不起作用(見輸出)。在第一個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(Array keys,Array items); 它將根據第一個數組中存在的鍵進行排序,該數組已經排序。 – Nilay

+0

@Nilay:你看過這個問題嗎? –

+0

是@TimSchmelter,您可以在調試數組中看到第一個已經排序並用作該方法的關鍵字,因此它不會對它的項目數組排序。嘗試用排序firstArray。 – Nilay

回答

3

數組是一種參考類型。變量是一個佔位符,值爲。存儲在引用類型變量中的值是其所引用對象的內存中的「地址」(可以這麼說)。當您將一個參考類型變量的值分配給另一個時,您只需複製存儲在變量中的值即

那麼這與什麼有什麼關係? 全部

int[] temp = first; 

這行這裏沒有做你認爲應該做的事。它只是將存儲在first中的值複製到名爲temp的變量中。那價值是什麼?是的,陣列的地址,所以現在,tempfirst指向完全相同的陣列;所以,無論您對陣列víatemp所做的更改也會更改由first引用的陣列,因爲它們都是相同的陣列。

您需要創建每次都有一個新的數組副本。最簡單的方法如Pablo notPicasso's answer所示。

+0

感謝您的澄清! – 10a

3

創建新的數組:

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

我會想'first.Clone()'會更好,因爲我希望它對ToArray()'可能不會(儘管它可能)不適用的數組進行優化。 – Chris

+1

@Chris true,但'IClonable'就是這麼混亂(你永遠不知道它是否應該做它應該做的),只要我可以隨便離開它。 「ToArray」很清楚它的功能,除非有其他性能原因,否則我更喜歡這個解決方案。 – InBetween

+0

@InBetween:所有有效的點。 – Chris