2013-05-19 10 views
9

誰かが助けてくれることを願っています。 いくつかの名前入力を受け付ける可変長配列を作成しました。 これで、配列をアルファベット順にソートし、コンソール画面に戻したいと思っています。C#でアルファベット順に配列を並べ替える

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

答えて

19

これはトリックを行うものとする

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

+1は、最短で最も互換性のある答えです。 –

+0

謝罪、私は答えとしてマークしましたが、ありがとうございました。答えを出さないのは完璧でしたが、具体的な答えではなく、OPのために他のリンクやフレーズを参照しているため、これは完全な – user001

7

あなたの問題をカバーするために余分な作業をしようと何のノートを持っていないのです。 Student構造体を定義することによって、単なる名前以上を表現できるエンティティを作成しています。たとえば、Age,Hometownなどに拡張することができます。 (このような理由から、あなたの配列studentsではなく、namesに名前を付けるより有意義かもしれません。)

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

複数のフィールドの可能性を考えると、Array.Sort方法は、あなたが上にあなたのリストをソートしたいのかを知る必要があります。あなたは名前、年齢、または故郷によって学生を注文しますか? MSDNドキュメント当たり

Array.Sort<T>に:

は、配列の各要素のIComparable<T>ジェネリックインターフェイスの実装を使用して全体Array内の要素を並べ替え。あなたのケースでは、Student - - それは2つのStudentインスタンスを比較する方法を知っているArray.Sort実装ために、IComparable<T>インタフェースを実装する必要があります

これは、あなたが整理しようとしているタイプがあることを意味します。あなたは、学生が常に名でソートされることを確信している場合は、そのようにそれを実現することができます。

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方法である:あなたのStudent配列であなたのStudentオブジェクトのnameプロパティでソートするには

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

右、そしてどのように彼はそれをソートしていますか?答えではありません。 –

+3

@ newStackExchangeInstance:もちろんそれは答えです。彼がIComparableを実装すると、Array.Sortを呼び出すことによって問題が解決されます。 –

0

、あなたの配列をソートします

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

を使用することができます代わりに、またはSystem.Linq

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

これはソートされたを返すことができますを配列(.ToArray())またはリスト(.ToList()。それが重要な場合はそうのようなString.Compareで行うことができます別の答えで指摘したように)

、大文字と小文字を区別しないでソートすることを忘れないでください:

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

Simple bubble sort c#

あなたはいくつかの変更を行う必要があります、その例は、intのための文字列のためにあなたが比較する必要があります名前。

あなたはソートのためのより良いアルゴリズムを見つけることができます。今はバブルソートはあなたのために大丈夫です。

+2

-1でした。 –

0

Array.Sortではなく、これを使用することもできます。あなたはIComparableをを実装するために学生を拡張場合であるとして、あなたはSortを使用することができますいずれか

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

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

最後の1つは、 '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()); 
関連する問題