How to implement IComparable


My code includes struct called Time.

I would like to implement IComparable<Time> interface in my struct to compare two variables of type 'Time'.

I've already did it with IEquatable and it works, but I can't figure out how to do it with IComparable.

Since Time consists of three variables (hours, min, sec) I can't simply consider each case in if. Or can I? Could you give me a hint how to code it? Thank you.

{    
    public struct Time : IEquatable<Time>, IComparable<Time>
    {
        private byte hours, minutes, seconds;

        public byte Hours { get { return hours; } }
        public byte Minutes { get { return minutes; } }
        public byte Seconds { get { return seconds; } }

        public Time(byte hh, byte mm, byte ss)
        {
            if (hh < 0 || hh > 24)
                throw new ArgumentOutOfRangeException();
            if (mm < 0 || mm > 60)
                throw new ArgumentOutOfRangeException();
            if (ss < 0 || ss > 60)
                throw new ArgumentOutOfRangeException();

            this.hours = hh;
            this.minutes = mm;
            this.seconds = ss;
        }

        public Time(byte hh, byte mm) : this(hh, mm, default(byte)) { }

        public Time(byte hh) : this(hh, default(byte), default(byte)) { }

        public Time(string hms)
        {
            string[] arr = hms.Split(':');

            this.hours = Convert.ToByte(arr[0]);
            this.minutes = Convert.ToByte(arr[1]);
            this.seconds = Convert.ToByte(arr[2]);
        }

        public override string ToString()
        {
            return Hours + ":" + Minutes + ":" + Seconds;
        }

        public override bool Equals(object t)
        {
            if (t == null || this.GetType() != t.GetType()) return false;

            return (this.Hours == ((Time)t).Hours &&
                this.Minutes == ((Time)t).Minutes &&
                this.Seconds == ((Time)t).Seconds);
        }

        public override int GetHashCode()
        {
            return this.GetHashCode();
        }

        // IEquatable
        public bool Equals(Time other)
        {
            return this.Equals((object)other);
        }

        public static bool operator == (Time t1, Time t2)
        {
            return t1.Equals(t2);
        }

        public static bool operator !=(Time t1, Time t2)
        {
            return !t1.Equals(t2);
        }

        // IComparable
        public int CompareTo(Time other)
        {
            if (this == other)
                return 0;

            // Code that compares two variables
        }

        public static bool operator > (Time t1, Time t2)
        {
            return t1.CompareTo(t2) == 1;
        }

        public static bool operator < (Time t1, Time t2)
        {
            return t1.CompareTo(t2) == -1;
        }

        public static bool operator >= (Time t1, Time t2)
        {
            return t1.CompareTo(t2) >= 0;
        }

        public static bool operator <= (Time t1, Time t2)
        {
            return t1.CompareTo(t2) <= 0;
        }
    }
}


public int CompareTo(Time other)
{
    var by_hour = this.Hours - other.Hours;
    if (by_hour != 0)
        return by_hour;

    var by_minute = this.Minutes - other.Minutes;
    if (by_minute != 0)
        return by_minute;

    return this.Seconds - other.Seconds;
}

Also change all places where you use the Compare method to account for the fact that it can return non-zero values other than 1 and -1.