use*_*001 15 c# arrays sorting
希望有人能提供帮助.我创建了一个可变长度数组,它将接受多个名称输入.我现在想按字母顺序对数组进行排序,并将其返回到控制台屏幕.
我以为是Array.Sort(名字); 会为我这样做,但我得到一个异常抛出.我一直在看笔记,例子和在线,但似乎没有什么能与我正在做的事情相匹配.
到目前为止我已经完成了以下工作.我接近在这里撕扯我的头发!PS我一直试图弄清楚这几个小时,我已经30多岁了,试图学习自己,所以请不要只说"做你的功课"我试图解决这个问题而不能这样我需要有人来解释哪里出错了 这是一个星期天,我正在努力做额外的工作,没有任何笔记来完全覆盖这一点
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Student_Array
{
class Program
{
struct Student
{
public string Name;
}
static void Main(string[] args)
{
int numberOfStudents;
Student[] names;
string input;
Console.WriteLine("How many students are there?");
input = Console.ReadLine();
numberOfStudents = int.Parse(input);
names = new Student[numberOfStudents];
for (int i = 0; i < names.Length; i++)
{
Student s;
Console.WriteLine("Please enter student {0}'s name", (i + 1));
s.Name = Console.ReadLine();
names[i] = s;
}
***Array.Sort<Student>(names);***
for (int i = 0; i < names.Length; i++)
{
Console.WriteLine(names[i].Name);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
ole*_*sii 28
这应该可以解决问题
Array.Sort(names, (x,y) => String.Compare(x.Name, y.Name));
Run Code Online (Sandbox Code Playgroud)
你在这里的问题可能是你混淆了学生和名字的概念.通过定义Student结构,您将创建一个可以表示不仅仅是名称的实体.例如,您可以将其扩展为包括Age,Hometown等等.(因此,命名数组可能更有意义,students而不是names.)
struct Student
{
public string Name;
public int Age;
public string Hometown;
}
Run Code Online (Sandbox Code Playgroud)
考虑到多个字段的可能性,该Array.Sort方法需要知道您要对列表进行排序的内容.你想要学生按名字,年龄或家乡订购吗?
根据MSDN文档Array.Sort<T>:
Array使用IComparable<T>Array的每个元素的通用接口实现对整个元素进行排序.
这意味着您尝试排序的类型(在您的情况下)Student必须实现IComparable<T>接口,以便Array.Sort实现知道它应如何比较两个Student实例.如果您确信学生将始终按名称排序,您可以这样实现:
struct Student : IComparable<Student>
{
public string Name;
public int Age;
public string Hometown;
public int CompareTo(Student other)
{
return String.Compare(this.Name, other.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以提供一个函数来提取sort方法本身的排序键.实现这一目标的最简单方法是通过LINQ OrderBy方法:
names = names.OrderBy(s => s.Name).ToArray();
Run Code Online (Sandbox Code Playgroud)
Sort如果您扩展 Student 以实现 IComparable,您可以按原样使用;
struct Student : IComparable<Student>
{
public string Name;
public int CompareTo(Student other)
{
return String.Compare(Name, other.Name,
StringComparison.CurrentCultureIgnoreCase);
}
}
Run Code Online (Sandbox Code Playgroud)
...或者您可以将比较 lambda 传递到 Sort ...
Array.Sort<Student>(names, (x, y) => String.Compare(x.Name, y.Name,
StringComparison.CurrentCultureIgnoreCase));
Run Code Online (Sandbox Code Playgroud)
...或者作为第三种选择,只需创建一个新的、已排序的数组;
var newArray = names.OrderBy(x => x.Name.ToLower()).ToArray();
Run Code Online (Sandbox Code Playgroud)