如何使用有时相同的条目对List <person>进行排序?</person>

时间:2012-09-15 14:02:43

标签: c# wpf list sorting

我有一个关于在C#中排序的问题。

让我们假设List<Person> personList有50个项目 每个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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这完美无缺

personList.Sort((p1, p2)=>string.Compare(p1.Forename+p1.Surname, p2.Forname+ p2.Surname, true));

答案 2 :(得分: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引用的测试。