2017-07-14 27 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