2013-05-19 93 views
9

Hy vọng ai đó có thể trợ giúp. Tôi đã tạo một mảng độ dài thay đổi sẽ chấp nhận một số đầu vào tên. Tôi bây giờ muốn sắp xếp mảng theo thứ tự bảng chữ cái và trả về màn hình bảng điều khiển.Sắp xếp một mảng theo thứ tự bảng chữ cái trong C#

Tôi nghĩ rằng Array.Sort (tên); sẽ làm điều này cho tôi nhưng tôi nhận được một ngoại lệ ném. Tôi đã xem xét các ghi chú, ví dụ và trên mạng nhưng không có gì có vẻ phù hợp với những gì tôi đang làm.

Tôi đã thực hiện các bước dưới đây cho đến thời điểm này. Tôi sắp xé tóc ra đây! PS Tôi đã cố gắng tìm ra điều này trong nhiều giờ và tôi 30 tuổi cố gắng học bản thân mình, vì vậy xin đừng nói "Làm bài tập về nhà của bạn" Tôi đã cố gắng giải quyết vấn đề này và không thể để tôi cần ai đó giải thích nơi tôi đang đi sai. Đó là một ngày chủ nhật và tôi đang cố gắng để làm thêm công việc và không có ghi chú để trang trải này chính xác

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); 
      } 
     } 
    } 
} 

Trả lời

19

này sẽ làm các trick

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

+1 cho câu trả lời ngắn nhất và tương thích nhất. –

+0

Xin lỗi, tôi đã đánh dấu câu trả lời nhưng không bao giờ trả lời bằng Cảm ơn. Đó là hoàn hảo – user001

7

vấn đề của bạn ở đây có thể là bạn đang nhầm lẫn các khái niệm của học sinh và tên. Bằng cách xác định cấu trúc Student, bạn đang tạo một thực thể có thể đại diện cho nhiều hơn một tên đơn thuần. Ví dụ, bạn có thể mở rộng nó để bao gồm Age, Hometown, v.v. (Vì lý do này, nó có thể có ý nghĩa hơn để đặt tên mảng của bạn students hơn names.)

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

Với khả năng của nhiều lĩnh vực, phương pháp Array.Sort cần phải biết những gì bạn muốn sắp xếp danh sách của bạn trên. Bạn có muốn học sinh đặt hàng theo tên, theo độ tuổi, hoặc theo quê hương?

mỗi tài liệu MSDN trên Array.Sort<T>:

Sắp xếp các yếu tố trong toàn bộ một Array sử dụng IComparable<T> thực hiện giao diện chung của mỗi phần tử của mảng.

này có nghĩa là loại mà bạn đang cố gắng để sắp xếp - trong trường hợp của bạn, Student - phải thực hiện các giao diện IComparable<T>, để cho việc thực hiện Array.Sort biết làm thế nào nó nên so sánh hai Student trường. Nếu bạn bị thuyết phục rằng sinh viên sẽ luôn được sắp xếp theo tên, bạn có thể thực hiện nó như vậy:

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); 
    } 
} 

Hoặc, bạn có thể cung cấp chức năng trích xuất khóa sắp xếp cho chính phương thức sắp xếp. Cách đơn giản nhất để đạt được điều này thông qua LINQ OrderBy phương pháp:

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

Đúng vậy, và làm thế nào ông sắp xếp nó? Không phải là câu trả lời. –

+3

@ newStackExchangeInstance: Tất nhiên đó là câu trả lời. Nếu anh ta thực hiện IComparable, vấn đề của mình được giải quyết bằng cách gọi Array.Sort. –

0

Để sắp xếp theo name tài sản của Student đối tượng của bạn trong Student mảng, bạn có thể sử dụng

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

mà sẽ sắp xếp mảng của bạn tại chỗ hoặc với System.Linq:

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

có thể trả lại thứ tự được sắp xếp IEnumerable dưới dạng mảng (.ToArray()) hoặc danh sách (.ToList().)

Hãy nhớ sắp xếp case-insensitive nếu vấn đề, như đã chỉ ra trong câu trả lời khác, có thể được thực hiện trong String.Compare như vậy:

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

bạn có thể tìm thấy một trong các thuật toán cơ bản ở đây: Simple bubble sort c#

bạn phải thực hiện một số sửa đổi, ví dụ đó dành cho int, cho chuỗi bạn phải so sánh thứ tên điện tử.

bạn có thể tìm các thuật toán tốt hơn để sắp xếp. cho bây giờ bong bóng sắp xếp là ok cho bạn.

+2

-1 vì không đưa ra một câu trả lời, nhưng đề cập đến các liên kết khác hoặc một số cụm từ được, cho OP, không phải là một câu trả lời cụ thể. –

0

Bạn cũng có thể sử dụng tính năng này thay vì sử dụng Array.Sort.

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

Bạn có thể sử dụng Sort như là nếu bạn mở rộng Student để thực hiện IComparable;

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

... hoặc bạn có thể vượt qua một so sánh lambda vào Sắp xếp ...

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

... hoặc như là một lựa chọn thứ ba chỉ cần tạo một mới, sắp xếp, mảng;

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

Đối với người cuối cùng, có thể sắp xếp theo 'x => x.Name.ToLower()' có thể được đề xuất –

+0

@JordanTrudgett Ah, vâng, bỏ lỡ phần cuối cùng :) –

0

Tạo một lớp Comparer

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

Sắp xếp:

Array.Sort(students,new StudentComparer()); 
Các vấn đề liên quan