在C#中按字母顺序排序数组

希望有人能提供帮助。 我创建了一个可变长度数组,它将接受多个名称输入。 我现在想按字母顺序对数组进行排序,并将其返回到控制台屏幕。

我以为是Array.Sort(名字); 会为我做这件事,但我得到一个exception抛出。 我一直在看笔记,例子和在线,但似乎没有什么能与我正在做的事情相匹配。

到目前为止我已经完成了以下工作。 我差点把头发撕成碎片! 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(names);*** for (int i = 0; i < names.Length; i++) { Console.WriteLine(names[i].Name); } } } } 

这应该可以解决问题

 Array.Sort(names, (x,y) => String.Compare(x.Name, y.Name)); 

你在这里的问题可能是你混淆了学生和名字的概念。 通过定义Student结构,您将创建一个可以表示不仅仅是名称的实体。 例如,您可以将其扩展为包括AgeHometown等。 (因此,为数组students names而不是names可能更有意义。)

 struct Student { public string Name; public int Age; public string Hometown; } 

鉴于可能存在多个字段, Array.Sort方法需要知道您要对列表进行排序的内容。 你想要学生按名字,年龄或家乡订购吗?

根据Array.Sort上的MSDN文档:

使用Array的每个元素的IComparablegenerics接口实现对整个Array的元素进行排序。

这意味着您尝试排序的类型(在您的情况下为Student )必须实现IComparable接口,以便Array.Sort实现知道它应如何比较两个Student实例。 如果您确信学生将始终按名称排序,您可以这样实现:

 struct Student : IComparable { public string Name; public int Age; public string Hometown; public int CompareTo(Student other) { return String.Compare(this.Name, other.Name); } } 

或者,您可以提供一个函数来提取排序方法本身的排序键。 实现这一目标的最简单方法是通过LINQ OrderBy方法:

 names = names.OrderBy(s => s.Name).ToArray(); 

如果您扩展Student以实现IComparable ,您可以使用Sort as is;

  struct Student : IComparable { public string Name; public int CompareTo(Student other) { return String.Compare(Name, other.Name, StringComparison.CurrentCultureIgnoreCase); } } 

…或者您可以将比较lambda传递给Sort …

 Array.Sort(names, (x, y) => String.Compare(x.Name, y.Name, StringComparison.CurrentCultureIgnoreCase)); 

…或者作为第三个选项,只需创建一个新的,已排序的数组;

 var newArray = names.OrderBy(x => x.Name.ToLower()).ToArray(); 

创建一个比较器类

 class StudentComparer : IComparer { public int Compare(Student a, Student b) { return a.Name.CompareTo(b.Name); } } 

分类:

 Array.Sort(students,new StudentComparer()); 

您也可以使用它,而不是使用Array.Sort。

 names = names.OrderBy(p => p.Name).ToArray(); 

要按Student数组中Student对象的name属性进行排序,可以使用

 Array.Sort(names, (s1, s2) => String.Compare(s1.Name, s2.Name)); 

它将对您的数组进行排序,或使用System.Linq

 names = names.OrderBy(s => s.Name).ToArray(); 

它可以将已排序的IEnumerable作为数组( .ToArray() )或列表( .ToList() 。)

如果重要的话,请记住排序不区分大小写,如另一个答案所指出的那样,可以在String.Compare完成, String.Compare所示:

 String.Compare(s1.Name, s2.Name, StringComparison.CurrentCultureIgnoreCase) 

你可以在这里找到一个基本算法: 简单的冒泡排序c#

你必须做一些修改,例如是int,对于字符串,你必须比较名称。

你可以找到更好的排序算法。 现在冒泡排序对你来说没问题。