排序数组C#:键数组无意中更改

时间:2017-07-14 10:00:25

标签: c# arrays sorting

我正在尝试基于一个键阵列对不同的项目数组进行排序。以下简单代码代表了我更复杂的代码:

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

如何确保我的密钥数组不会被排序,以便我可以多次使用它?

2 个答案:

答案 0 :(得分:3)

创建新阵列:

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

答案 1 :(得分:3)

数组是引用类型。变量是值占位符。存储在引用类型变量中的值是它所引用的对象的内存中的“地址”(可以这么说)。将一个引用类型变量的值分配给另一个时,只需复制存储在变量中的值

那么这与任何事情有什么关系? 一切的!

int[] temp = first;

这一行不符合你的想法。它只是将first中存储的值复制到名为temp的变量中。那个价值是多少?是的,数组的地址,现在,tempfirst 都指向完全相同的数组;所以,你对数组víatemp所做的任何更改也会改变first引用的数组,因为两者都是相同的数组。

每次都需要创建数组的新副本。最简单的方法是Pablo notPicasso's answer