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
时,sorted
和 Output
将引用 相同的数组 .
如果你想要一个副本,你将不得不遍历元素或使用辅助方法,例如 Array.Copy
:
sorted = new string[Output.Length];
Array.Copy(Output, sorted, Output.Length);
string[] sorted = Output;
Array.Sort(sorted);
当您调用 Array.Sort
时,此 修改 您传递给它的数组。因为数组是通过引用传递的,所以 sorted
和 Output
引用 相同的数组 ,它被排序。
换句话说,您在对元素进行排序时正在更改 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,这使得数组(和列表)操作更易于阅读(恕我直言)。
我编写了对给定输入进行排序的代码,但在它 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
时,sorted
和 Output
将引用 相同的数组 .
如果你想要一个副本,你将不得不遍历元素或使用辅助方法,例如 Array.Copy
:
sorted = new string[Output.Length];
Array.Copy(Output, sorted, Output.Length);
string[] sorted = Output;
Array.Sort(sorted);
当您调用 Array.Sort
时,此 修改 您传递给它的数组。因为数组是通过引用传递的,所以 sorted
和 Output
引用 相同的数组 ,它被排序。
换句话说,您在对元素进行排序时正在更改 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,这使得数组(和列表)操作更易于阅读(恕我直言)。