【问题标题】:Sorting arrays C#: key array changes unintendedly排序数组 C#:键数组意外更改
【发布时间】:2017-07-14 10:00:24
【问题描述】:

我正在尝试根据一个键数组对不同的项目数组进行排序。下面的简单代码代表我的更复杂的代码:

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(first,third) 对“第三个”进行排序时,排序不起作用(参见输出)。似乎“first”在第一个 Array.Sort 期间与“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

如何确保我的键数组没有被排序以便我可以多次使用它?

【问题讨论】:

  • public static void Sort(Array keys, Array items);它将基于键进行排序,该键出现在第一个数组中,该数组已经排序。
  • @Nilay:你读过这个问题吗?
  • 是的@TimSchmelter,您可以在调试数组中看到第一个已经排序并用作该方法的键,因此它不会对其项目数组进行排序。尝试对 firstArray 进行排序。
  • @Nilay:数组“first”最初没有排序,我的问题是为什么“first”得到排序,即使我没有在第一个 Array.Sort 中使用“first”。相反,我使用了“temp”并且仍然对“first”进行了排序,即使没有来自我这边的特定命令。 InBetween 的回答解释了我做错了什么。

标签: c# arrays sorting


【解决方案1】:

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

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

int[] temp = first;

这里的这条线没有做你认为应该做的事情。它只是将存储在first 中的值复制到名为temp 的变量中。那价值是什么?是的,数组的地址,所以现在tempfirst 指向完全相同的数组;因此,无论您通过temp 对数组所做的任何更改都会更改first 引用的数组,因为两者都是同一个数组。

您每次都需要创建一个新的数组副本。 Pablo notPicasso's answer 中显示了最简单的方法。

【讨论】:

  • 感谢您的澄清!
【解决方案2】:

创建新数组:

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

【讨论】:

  • 我想first.Clone() 会更好,因为我希望它针对ToArray() 可能不会的数组进行优化(尽管它可能是)。
  • @Chris 是的,但IClonable 简直是一团糟(你永远不确定它是否会做它应该做的事情),我只是尽可能地逃避它。 ToArray 很清楚它的作用,除非有性能原因,否则我更喜欢这个解决方案。
  • @Chris - .ToArray() 针对数组进行了优化。这实际上是一个Array.Copy 电话。
猜你喜欢
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 2013-05-16
  • 2014-05-21
  • 1970-01-01
相关资源
最近更新 更多