Как сравнить несколько значений объекта друг с другом? - PullRequest
1 голос
/ 17 января 2011

Предположим, у меня есть объект со следующими значениями (также обратите внимание, что я не хочу использовать объект datetime для этого, только следующие значения ниже, и я хочу решить это в самом компараторе):

int year; 
int month; 
int day;
int sec;
int min;

Как я могу сравнить все эти несколько значений в моем Comparer друг с другом, чтобы они были перечислены в соответствии с датой?

Затем я хочу создать класс Comparer.cs:

class MyComparer: IComparer
{
    int sort;

    public MyComparer(int s)
    {
        sort= s;
    }

    public int Compare(object x, object y)
    {
        Date d1 = (Date)x;
        Date d2 = (Date)y;
        int result= 0;

         // d1.Year.CompareTo(d2.Year);  //get accessors from other class
        // i seem to be limited here by comparing only 1 single value to a other?

        return result;
    }
}

}

Ответы [ 3 ]

7 голосов
/ 17 января 2011

Как это:

result = d1.Year.CompareTo(d2.Year)
if (result != 0) return result;

result = d1.Month.CompareTo(d2.Month)
if (result != 0) return result;

...

return 0;   //All properties were equal
1 голос
/ 17 января 2011

Вам просто нужно будет продолжать сравнивать, пока у вас не будет разницы или не останется ничего для сравнения.

int result; 
result = d1.year.CompareTo(d2.year);
if (result == 0)
   result = d1.month.CompareTo(d2.month);
if (result == 0)
   // continue comparisons through day, hour, minute, second as necessary

return result;
0 голосов
/ 17 января 2011

Сначала начните сравнение, начиная с самого значимого элемента, например:

    public class MyDate : IComparable<MyDate>
    {
        public enum MyMonth { Jan = 1 , Feb , Mar , Apr , May , Jun , Jul , Aug , Sep , Oct , Nov , Dec , }

        public int     Year   ;
        public MyMonth Month  ;
        public int     Day    ;
        public int     Hour   ;
        public int     Minute ;
        public int     Second ;

        private static Comparer _comparerInstance = null ;
        private static Comparer comparerInstance
        {
            get
            {
                if ( _comparerInstance == null )
                {
                    _comparerInstance = new Comparer() ;
                }
                return _comparerInstance ;
            }
        }

        public class Comparer : IComparer<MyDate> 
        {
            #region IComparer<MyDate> Members

            public int Compare(MyDate x, MyDate y)
            {
                if ( x == null || y == null ) throw new ArgumentNullException() ;
                if ( object.ReferenceEquals(x,y) ) return 0 ;

                int rc ;

                if (      x.Year < y.Year ) rc = -1 ;
                else if ( x.Year > y.Year ) rc = +1 ;
                else // x.Year == y.Year
                {
                    if (      x.Month < y.Month ) rc = -1 ;
                    else if ( x.Month > y.Month ) rc = +1 ;
                    else // x.Month == y.Month
                    {
                        if (      x.Day < y.Day ) rc = -1 ;
                        else if ( x.Day > y.Day ) rc = +1 ;
                        else // x.Day == y.Day
                        {
                            if (      x.Hour < y.Hour ) rc = -1 ;
                            else if ( x.Hour > y.Hour ) rc = +1 ;
                            else // x.Hour == y.Hour
                            {
                                if (      x.Minute < y.Minute ) rc = -1 ;
                                else if ( x.Minute > y.Minute ) rc = +1 ;
                                else // x.Minute = y.Minute
                                {
                                    if (      x.Second < y.Second ) rc = -1 ;
                                    else if ( x.Second > y.Second ) rc = -1 ;
                                    else /* x.Second == y.Seconds */ rc = 0 ;
                                }
                            }
                        }
                    }
                }

                return rc ;
            }
            #endregion
        }

        #region IComparable<MyDate> Members

        public int CompareTo( MyDate other )
        {
            return comparerInstance.Compare( this , other ) ;
        }

        #endregion
    }

Это просто скучная сантехническая работа, никакой магии для нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...