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

时间:2013-05-19 15:57:09

标签: 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);
            }
        }
    }
}

7 个答案:

答案 0 :(得分:25)

这应该做的伎俩

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

答案 1 :(得分:7)

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

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

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

根据Array.Sort<T>上的MSDN文档:

  

使用数组中每个元素的Array通用接口实现对整个IComparable<T>中的元素进行排序。

这意味着您尝试排序的类型(在您的情况下为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);
    }
}

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

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

答案 2 :(得分:4)

如果您扩展学生以实施IComparable ,您可以按原样使用Sort;

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

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

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

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

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

答案 3 :(得分:1)

创建比较器类

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

类别:

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

答案 4 :(得分:0)

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

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(s1.Name, s2.Name, StringComparison.CurrentCultureIgnoreCase)

答案 5 :(得分:0)

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

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

答案 6 :(得分:-3)

您可以在此处找到一种基本算法:Simple bubble sort c#

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

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