gpt4 book ai didi

c# - Array.Sort() 对原始数组进行排序,而不仅仅是复制

转载 作者:太空狗 更新时间:2023-10-29 18:08:14 25 4
gpt4 key购买 nike

此代码片段来自 C# 2010 for Dummies。令我感到困惑的是,当使用 Array.Sort() 方法时,我的数组副本 (sortedNames) 和原始数组 (planets) 都会得到排序,即使它只调用 sortedNames 上的 Sort 方法。

第二个 foreach 循环引用哪个数组并不重要,输出是相同的。

static void Main(string[] args)
{
Console.WriteLine("The 5 planets closest to the sun, in order: ");
string[] planets = new string[] { "Mercury","Venus", "Earth", "Mars", "Jupiter"};
foreach (string planet in planets)
{
Console.WriteLine("\t" + planet);
}
Console.WriteLine("\nNow listed alphabetically: ");


string[] sortedNames = planets;
Array.Sort(sortedNames);

foreach (string planet in planets)
{
Console.WriteLine("\t" + planet);
}
}

最佳答案

sortedNamesplanets 都指的是同一个数组。基本上这两个变量都指向内存中的相同位置,因此当您对任一变量调用 Array.Sort 时,对数组的更改会反射(reflect)在两个变量上。

由于 C# 中的数组是引用类型sortedNamesplanets 都“指向”内存中的相同位置。

将此与值类型对比,值类型将数据保存在自己的内存分配中,而不是指向内存中的另一个位置。

如果你想保持 planets 完整,你可以使用创建一个全新的数组,然后使用 Array.Copy 的内容填充到新数组中>行星:

/* Create a new array that's the same length as the one "planets" points to */
string[] sortedNames = new string[planets.Length];

/* Copy the elements of `planets` into `sortedNames` */
Array.Copy(planets, sortedNames, planets.Length);

/* Sort the new array instead of `planets` */
Array.Sort(sortedNames);

或者,使用 LINQ,您可以使用 OrderByToArray 创建一个新的有序数组:

string[] sortedNames = planets.OrderBy(planet => planet).ToArray();

一些可能有助于值类型引用类型的资源:

关于c# - Array.Sort() 对原始数组进行排序,而不仅仅是复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27197988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com