c# 为什么我使用 类 得到相同的输出?

c# why do I get the same output using classes?

我编写了对给定输入进行排序的代码,但在它 return 排序输入之后,它总是 return 相同的输出。我在 Visual Studio.

中使用 .NET 5.0(当前)创建控制台应用程序

当我输入“Car Apple Banana”时,它会在 words.Sorted()

中排序

之后我打印出原始输入,但它似乎也被排序了。我不知道为什么,因为我从来不排序。

当输入为:“Car Apple Banana”时

我现在得到的输出是:

苹果香蕉车

苹果香蕉车

虽然需要:

苹果香蕉车

汽车苹果香蕉

主要代码如下:

using System;
using System.Threading.Tasks;
using System.Linq;
using System.Collections.Generic;

namespace _10_Words
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] input_1 = Console.ReadLine().Split(' ');
            Words words = new Words(input_1);

            Console.WriteLine(words.Sorted());
            Console.WriteLine(words.Normal());
        }
    }
}

这是 class 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _10_Words
{
    class Words
    {
        public string[] Output { get; set; }

        public Words(string[] input)
        {
            Output = input;
        }

        public string Sorted()
        {
            string[] sorted = Output;

            Array.Sort(sorted);

            string sorted_array = string.Join(" ", sorted);
            return Convert.ToString(sorted_array);
        }

        public string Normal()
        {
            string[] normal = Output;

            string normal_output = string.Join(" ", normal);
            return Convert.ToString(normal_output);
        }
    }
}

写的时候

string[] sorted = Output;

您正在为要排序的数组输出分配一个引用,然后您使用

对 iy 进行排序
Array.Sort(sorted);

但由于 sorted 只是对 Output 的引用,您实际上是在对 Output 进行排序。更好的方法是直接打印原始数组,然后就地排序,然后打印。

您似乎假设行

string[] sorted = Output;

input 复制到 Output,然后您进行排序 Output,同时保持 input 不变。

不是这样的

数组是 reference types。因此,当您将 Output 之类的数组分配给另一个数组变量(例如 sorted 时,sortedOutput 将引用 相同的数组 .

如果你想要一个副本,你将不得不遍历元素或使用辅助方法,例如 Array.Copy:

sorted = new string[Output.Length];
Array.Copy(Output, sorted, Output.Length);
string[] sorted = Output;

Array.Sort(sorted);

当您调用 Array.Sort 时,此 修改 您传递给它的数组。因为数组是通过引用传递的,所以 sortedOutput 引用 相同的数组 ,它被排序。

换句话说,您在对元素进行排序时正在更改 Output

最简单的解决方法是确保创建一个 数组,其元素与旧数组相同:

// Don't forget to include this at the top of the file
using System.Linq;

string[] sorted = Output.ToArray();

Array.Sort(sorted);

另一种解决方案是将您的排序更改为不改变输入数组的方法,并且 returns 您是一个新的(已排序的)数组:

// Don't forget to include this at the top of the file
using System.Linq;

string[] sorted = Output.OrderBy(x => x).ToArray();

这两种解决方案都使用 LINQ,这使得数组(和列表)操作更易于阅读(恕我直言)。