C# List<> 如何按照3个属性进行排序 .Net 2.0

7

假设我有一个Person类,其中包含Name、Age和Level属性。

我知道如何按照其中一个属性进行排序,使用

        PersonList.Sort(delegate(Person p1, Person p2) {
            return p1.Name.CompareTo(p2.Name);
        });

但是如何按照姓名、年龄和级别进行排序。

相当于SQL语句:ORDER BY Name,Age,Level

谢谢


你们有C# 3.0/.NET 3.5吗? - Noldorin
8个回答

28

修改现有代码:

PersonList.Sort(delegate(Person p1, Person p2) {
        int r = p1.Name.CompareTo(p2.Name);
        if (r == 0) r = p1.Age.CompareTo(p2.Age);
        if (r == 0) r = p1.Level.CompareTo(p2.Level);
        return r;
    });

或者,一个简单的类似LINQ的解决方案:

PersonList = PersonList.OrderBy(p => p.Name)
                       .ThenBy(p => p.Age)
                       .ThenBy(p => p.Level).ToList();

感谢修复,马克。我意识到了我的错误,但因为网络不稳定,我编辑起来有些困难。 - Joel Coehoorn
很好!!!在.Net 2.0上,第一个解决方案完美地运行。敬王。 - Ruby n00b

4

您是否考虑过切换到.NET 3.5并使用LINQ?在LINQ中,像这样的事情非常容易:

personList = personList.OrderBy(p => p.Name).
    ThenBy(p => p.Age).ThenBy(p => p.Level).ToList();

2

我建议在你的Person类上实现IComparable接口。在你自定义的比较方法中,你可以设置逻辑来比较所有三个属性,并确保这三个属性有适当的“权重”(例如,如果两个Person实例具有相同的姓名,那么下一个排序应该是按年龄还是按级别)。


1

假设您正在使用.NET 3.5

 IQueryable<Person> people = PersonList.AsQueryable();

 return people.OrderBy(x => x.Name).ThenBy(x => x.Age).ThenBy(x => x.level);

0
如果您有可用的C# 3.0(LINQ支持),那么您可以执行以下操作:
var result = (from p in PersonList
              orderby p.Name, p.Age, p.Level
              select p).ToList();

0
你考虑过使用LINQ to Objects吗?
var x = (from p in PersonList
        orderby p.Name, p.Age, p.Level
        select p).ToList();

0
var result = from p in persons
             orderby p.Name, p.Age, p.Level
             select p;

0
你需要在第一个想要排序的属性上调用CompareTo方法,获取返回的值,如果它是0,则调用下一个属性上的CompareTo方法,并重复这个过程。每次返回0时,继续到下一个属性,直到你得到一个非零值(然后将其返回)或者你到达了你想要排序的属性的末尾。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接