【问题标题】:How to compare values of two objects in C#如何在C#中比较两个对象的值
【发布时间】:2012-10-16 13:57:25
【问题描述】:

我创建了一个结构

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

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

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

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

【问题讨论】:

标签: c#


【解决方案1】:

IComparable 暴露 CompareTo&lt;&gt; 必须分别重载:

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 才能正确获取 the contract

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

此外,实现IComparable&lt;T&gt; 意味着CompareTo(T value) 采用T 的参数。因此MyCalendar : IComparable&lt;MyCalender&gt; 应该实现一个方法CompareTo(MyCalendar other) 而不是PersianDate(或实现IComparable&lt;PersianDate&gt;)。

【讨论】:

  • 非常感谢,我使用了这段代码,但是当我使用 public Foo(int value) 时我得到错误“必须在控制权返回给调用者之前完全分配”
  • 您是否初始化了所有readonly 字段?我在 VS2012 中编写的 Foo 类可以编译,因为 value 已初始化。
  • 是的,它是只读的。我使用 vs2012 RC。我有 3 个初始化 MyCalender 结构的实例。
  • 等一下,你现在做了什么? Foo 只是一个展示原理的示例类。在MyCalendar 中,运营商需要获取MyCalendar 实例。你能告诉我们你现在得到的代码吗?
  • 我添加了另一段关于 MyCalendarPersianDate 的内容。我不确定 CompareTo 首先是否正确实施。所以,请向你展示相关代码的全部内容:)
【解决方案2】:

您应该使用已实现的 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;
        }

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

【讨论】:

    【解决方案3】:

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

    想要什么

      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);
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 2013-05-06
      • 1970-01-01
      • 2019-03-09
      相关资源
      最近更新 更多