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

这完美地工作

personList.Sort((p1, p2)=>string.Compare(p1.Forename+p1.Surname, p2.Forname+ p2.Surname, true));
于 2012-09-15T14:10:37.817 回答
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();

您也可以将 an 传递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 回答