我正在尝试基于一个键阵列对不同的项目数组进行排序。以下简单代码代表了我更复杂的代码:
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);
}
数组,名为' second'和第三个'应该根据数组的顺序排序' first'。我发现我可以这样做:
Array.Sort(first, second)
这完全有效,直到我添加另一个Array.Sort来排序第三个'。因为我想保持第一个'作为其他排序操作的关键数组,我使用一个名为' temp'的临时数组。保存第一个'的初始序列这样我每次都可以重复使用。当我第一次重用时,也要排序第三个'使用Array.Sort(第一个,第三个),排序不起作用(请参阅输出)。似乎是第一个'与' temp'一起排序在第一个Array.Sort期间,即使它不在命令中。
输出:
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 :(得分:3)
创建新阵列:
Array.Sort(first.ToArray(), second);
Array.Sort(first.ToArray(), third);
答案 1 :(得分:3)
数组是引用类型。变量是值的占位符。存储在引用类型变量中的值是它所引用的对象的内存中的“地址”(可以这么说)。将一个引用类型变量的值分配给另一个时,只需复制存储在变量中的值。
那么这与任何事情有什么关系? 一切的!
int[] temp = first;
这一行不符合你的想法。它只是将first
中存储的值复制到名为temp
的变量中。那个价值是多少?是的,数组的地址,现在,temp
和first
都指向完全相同的数组;所以,你对数组víatemp
所做的任何更改也会改变first
引用的数组,因为两者都是相同的数组。
每次都需要创建数组的新副本。最简单的方法是Pablo notPicasso's answer。