2013-05-19 43 views
9

希望有人可以提供幫助。 我已經創建了一個可以接受多個名字輸入的可變長度數組。 我現在想按字母順序對數組進行排序並將其返回到控制檯屏幕。在C中按字母順序排列數組#

我以爲Array.Sort(names);會爲我做這個,但我得到一個異常拋出。我一直在看筆記,例子和在線,但似乎沒有什麼匹配我在做什麼。

我已經完成了下面的內容。我已經接近將我的頭髮拔出來了! 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); 
      } 
     } 
    } 
} 

回答

19

這應做的伎倆

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

+1爲最短和最兼容的答案。 –

+0

道歉,我標記爲答案,但從未答覆謝謝。這是完美的 – user001

7

您的問題可能是你混淆了學生和名稱的概念。通過定義Student結構,您可以創建一個實體,它可以表示不僅僅是一個名稱。例如,您可以將其擴展爲包括AgeHometown等等。 (出於這個原因,它可能是更有意義的命名陣列students而非names。)

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

鑑於多個領域的可能性,該Array.Sort方法需要知道要排序根據您的列表內容。你想讓學生按姓名,年齡還是家鄉排列?

每MSDN文檔上Array.Sort<T>

排序使用陣列的每個元件的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); 
    } 
} 

或者,您可以提供提取的排序鍵排序方法本身的功能。實現這一目標的最簡單的方法就是通過LINQ OrderBy方法:

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

對了,他是怎麼樣的呢?沒有答案。 –

+3

@ newStackExchangeInstance:當然這是一個答案。如果他實現了IComparable,他的問題可以通過調用Array.Sort來解決。 –

0

要通過你的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(s1.Name, s2.Name, StringComparison.CurrentCultureIgnoreCase) 
-3

你可以在這裏找到一個基本的算法:Simple bubble sort c#

你必須做一些修改,例如對於int,對於你必須比較的字符串e名稱。

你可以找到更好的排序算法。現在泡泡分類對你來說可以。

+2

-1沒有給出答案,而是指向其他鏈接或一些短語,對於OP而言,並不是一個具體的答案。 –

0

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

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

您可以使用Sort的是,如果你延長學生到實現IComparable;

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

...或者你可以傳遞一個比較拉姆達到排序...

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

...或作爲第三選擇剛剛創建一個新的排序,數組;

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

對於最後一個,也許可以按'x => x.Name.ToLower()'排序 –

+0

@JordanTrudgett啊,是的,錯過了最後一部分:) –

0

創建一個比較器類

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

排序:

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