在C#中按属性对对象列表进行排序

7

我有这个类:

public class Leg
{
    public int Day { get; set; }
    public int Hour { get; set; }
    public int Min { get; set; }
}

我有一个函数可以获取一系列legs,名为GetLegs()

List<Leg> legs = GetLegs();

现在我想对这个列表进行排序。首先需要考虑日期,然后是小时,最后是分钟。你应该如何解决这个排序问题呢?
谢谢。

4
为什么不使用本地的 DateTime 结构体呢?它支持开箱即用的比较和排序功能。请参阅 http://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx。 - Călin Darie
1
顺便说一下 - 看看右边的相关问题 - 有很多类似的帖子,你需要学会搜索一下。例如其中一个(我看到的第一个)... https://dev59.com/1nA75IYBdhLWcg3waIQJ - SkonJeet
正如您所见,这是我在这里的第一篇帖子,所以我可能会更习惯事物的运作方式。无论如何,感谢您的回复,不幸的是,在这种情况下我不能使用DateTime。 - Engern
5个回答

10

或许可以这样实现:

List<Leg> legs = GetLegs()
                .OrderBy(o=>o.Day)
                .ThenBy(o=>o.Hour)
                .ThenBy(o=>o.Min).ToList();

1

您需要在类上实现 IComparable<T> 接口,以允许在 C# 语言中更直观地对对象进行排序。当一个类实现了 IComparable 接口时,您还必须实现 public method CompareTo(T)

Leg 类实现了 IComparable<Leg>,这意味着一个 Leg 实例可以与其他 Leg 实例进行比较。

    #region "Leg Class that implements IComparable interface"
    public class Leg:IComparable<Leg>
    {
        public int Day { get; set; }
        public int Hour { get; set; }
        public int Min { get; set; }

        public int CompareTo(Leg leg)
        {
            if (this.Day == leg.Day)
            {
                if (this.Hour == leg.Hour)
                {
                    return this.Min.CompareTo(leg.Min);
                }
            }
            return this.Day.CompareTo(leg.Day);
        }
    }
    #endregion


   //Main code
   List<Leg> legs = GetLegs();
   legs.Sort();

1
你可以编写一个自定义的 IComparer<Leg> 并将其传递给 List<T>.Sort 方法。
或者,你可以在你的类中实现 IComparable<Leg> 并简单地调用 List<T>.Sort

不需要那么麻烦,他可以在 List<T>.Sort 中编写一个匿名 lambda。 - Moo-Juice
2
出于代码重用的原因,如果需要在多个位置进行排序/比较,则实现IComparable<T>可能是更好的选择。 - Matthias

0

我想这会有所帮助。

var o = legs.OrderBy(x => x.Day)
            .ThenBy(x => x.Hour)
            .ThenBy(x => x.Min);

0

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