2

C# の並べ替えについて質問です。

List<Person> personList50個のアイテムがあると仮定しましょう。
それぞれPersonが持っていstring forename, surnameます。

ここで、この人物のリストを並べ替えたいと思います。
まず、リストは でソートされますForename
したがって、私はこれを使用します:
personList.Sort((p1, p2)=>string.Compare(p1.Forename, p2.Forname, true));

Fornameこの後、すべてのエントリを同じもので並べ替えたいと思いますSurname

これどうやってするの?

編集: @Russ Cam: リストの例を次に示します。

未分類:

David Johnson
William Black
David Smith
Matthew Edwards
Jayden Anderson
Andrew Connor
Adam Johnson
Daniel Armstrong
Steve Anderson
Daniel Black

並べ替え:

Adam Johnson
Andrew Connor
Daniel Armstrong
Daniel Black
David Johnson
David Smith
Jayden Anderson
Matthew Edwards
Steve Anderson
William Black
4

3 に答える 3

8

これを行うには、 LINQのOrderByメソッドを使用できます

var sortedPersonList = personList.OrderBy(p => p.Forename).ThenBy(p => p.Surname);

編集:

期待どおりの順序で結果が返されることを確認するための完全なコンソール アプリケーションを次に示します。

static void Main()
{
    var personList = new List<Person>{
        new Person("David Johnson"),
        new Person("William Black"),
        new Person("David Smith"),
        new Person("Matthew Edwards"),
        new Person("Jayden Anderson"),
        new Person("Andrew Connor"),
        new Person("Adam Johnson"),
        new Person("Daniel Armstrong"),
        new Person("Steve Anderson"),
        new Person("Daniel Black")  
    };

    var sortedPersonList = personList.OrderBy(p => p.Forename).ThenBy(p => p.Surname);

    foreach (var person in sortedPersonList)
    {
        Console.WriteLine(person);
    }

    Console.Read();
}

public class Person
{
    public Person(string name)
    {
        var names = name.Split(' ');
        Forename = names[0];
        Surname = names[1];
    }

    public string Forename { get; set; }
    public string Surname { get; set; }

public override string ToString()
{
    return Forename + " " + Surname;
}
}

書き出す

Adam Johnson
Andrew Connor
Daniel Armstrong
Daniel Black
David Johnson
David Smith
Jayden Anderson
Matthew Edwards
Steve Anderson
William Black
于 2012-09-15T14:04:26.437 に答える
2

Personを実装させることができますSystem.IComparable<Person>

public class Person : IComparable<Person>
{
    public string Forename { get; set; }
    public string Surname { get; set; }

    public int CompareTo(Person other)
    {
        int comp = Forename.CompareTo(other.Forename);
        if (comp != 0) {
            return comp;
        }
        return Surname.CompareTo(other.Surname);
    }
}

この定義を使用すると、で直接並べ替えることができます

personList.Sort();

IComparer<T>メソッドにを渡すこともできますSort。これにより、人のさまざまな並べ替えを定義できます(名前、年齢、給与など)。

public class ComparePersonsByName : IComparer<Peron>
{
    public static readonly ComparePersonsByName Instance = 
        new ComparePersonsByName();

    private ComparePersonsByName()
    {
    }

    public int Compare(Person x, Person y)
    {
        int comp = x.Forename.CompareTo(y.Forename);
        if (comp != 0) {
            return comp;
        }
        return x.Surname.CompareTo(y.Surname);
    }
}

今、あなたはでソートすることができます

personList.Sort(ComparePersonsByName.Instance);

注:ここでは、シングルトンパターンのバリアントを使用しています。


null実際のシナリオでは、参照用のテストを追加する必要がある場合があります。

于 2012-09-15T14:53:47.173 に答える
2

これは完全に機能します

personList.Sort((p1, p2)=>string.Compare(p1.Forename+p1.Surname, p2.Forname+ p2.Surname, true));
于 2012-09-15T14:10:37.817 に答える