19

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

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

7 に答える 7

38

これはトリックを行います

Array.Sort(names, (x,y) => String.Compare(x.Name, y.Name));
于 2013-05-19T16:02:49.440 に答える
7

ここでの問題は、学生と名前の概念を混同している可能性があります。構造体を定義することによりStudent、単なる名前以上のものを表すことができるエンティティを作成しています。たとえば、 、 などを含めるように拡張できAgeますHometown。(このため、配列studentsではなく配列に名前を付ける方が意味がある場合がありますnames。)

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

複数のフィールドの可能性を考えると、Array.Sortメソッドは、リストを並べ替えたいものを知る必要があります。学生を名前順、年齢順、または出身地順に並べますか?

次の MSDN ドキュメントによるとArray.Sort<T>:

Array の各要素のジェネリック インターフェイス実装をArray使用して、要素全体を並べ替えます。IComparable<T>

これは、実装が2つのインスタンスを比較する方法を知るために、ソートしようとしているタイプ(あなたの場合)がインターフェースをStudent実装する必要があることを意味します。学生が常に名前でソートされると確信している場合は、次のように実装できます。IComparable<T>Array.SortStudent

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

または、ソート キーを抽出する関数をソート メソッド自体に提供することもできます。これを実現する最も簡単な方法は、LINQOrderByメソッドを使用することです。

names = names.OrderBy(s => s.Name).ToArray();
于 2013-05-19T16:01:24.227 に答える
5

Student を拡張して IComparable を実装するSort場合は、そのまま使用できます。

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

...または比較ラムダをSortに渡すことができます...

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

...または 3 番目のオプションとして、並べ替えられた新しい配列を作成するだけです。

var newArray = names.OrderBy(x => x.Name.ToLower()).ToArray();
于 2013-05-19T16:09:01.053 に答える
1

比較クラスを作成する

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

選別:

Array.Sort(students,new StudentComparer());
于 2014-02-19T14:30:53.970 に答える
0

配列内のオブジェクトのnameプロパティで並べ替えるには、次を使用できますStudentStudent

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)
于 2013-05-19T16:02:41.613 に答える
0

Array.Sort を使用する代わりに、これを使用することもできます。

names = names.OrderBy(p => p.Name).ToArray();
于 2013-05-19T16:03:25.250 に答える
-4

ここで基本アルゴリズムの1つを見つけることができます:単純なバブルソートc#

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

ソートのためのより良いアルゴリズムを見つけることができます。今のところ、バブル ソートは問題ありません。

于 2013-05-19T16:02:50.127 に答える