2

我创建了一个结构

 public struct MyCalender : IComparable<MyCalender>
{
 public int CompareTo(PersianDate other)
    {
        return DateTime.Compare(this, other);
    }
 .
 .
 .
 .
 .
}

我在另一个 UserControl 中新建了两个对象,我想比较它们。

我使用此代码,但出现错误。

 MyCalender value = new MyCalender(2010,11,12);
 MyCalender value2 = new MyCalender(2010,11,12);
        if (value < value2) ==> geterror
4

3 回答 3

5

IComparable暴露CompareTo<并且>必须单独重载:

class Foo : IComparable<Foo>
{
    private static readonly Foo Min = new Foo(Int32.MinValue);

    private readonly int value;

    public Foo(int value)
    {
        this.value = value;
    }

    public int CompareTo(Foo other)
    {
        return this.value.CompareTo((other ?? Min).value);
    }

    public static bool operator <(Foo a, Foo b)
    {
        return (a ?? Min).CompareTo(b) < 0;
    }

    public static bool operator >(Foo a, Foo b)
    {
        return (a ?? Min).CompareTo(b) > 0;
    }
}

编辑了代码,以便在与null. 为了简短起见,我使用了一个有效的快捷方式,除非valueInt32.MinValue正确的Foo. 严格来说,您必须null明确检查才能使合同正确:

根据定义,任何对象比较大于(或跟随)null,并且两个 null 引用比较彼此相等。

此外,实现IComparable<T>意味着CompareTo(T value)接受一个参数T。因此MyCalendar : IComparable<MyCalender>应该实现一个方法CompareTo(MyCalendar other)而不是PersianDate(或实现IComparable<PersianDate>)。

于 2012-10-16T14:00:50.743 回答
0

如果只比较一个日期时间对象,

会像

  DateTime A = DateTime.Now, B = DateTime.Now.AddMinutes(1);
  var isqual = A.Date.CompareTo(B.Date);

做这个把戏?

或类似的东西:

        class Calender
        {
            public DateTime datetime { get; set;}
        }

        class DateComparer : Calender, IComparable<Calender>
        {
            public int CompareTo(Calender other)
            {
                return other.datetime.Date.CompareTo(this.datetime.Date);
            }
        }
于 2012-10-16T14:02:22.567 回答
0

您应该使用已实现的 CompareTo 方法而不是 > 在您发布的行中,或者您需要为您的特定类重载 > 和 < 运算符。例如:

public static bool operator >(MyCalendar c1, MyCalendar c2)
        {
            return c1.CompareTo(c2) > 0;
        }
        public static bool operator <(MyCalendar c1, MyCalendar c2)
        {
            return c1.CompareTo(c2) < 0;
        }

但请记住,您必须使它们都超载。

于 2012-10-16T14:06:29.180 回答