1

我正在实施

int IComparer.Compare(object x, object y);

从 IComparer 界面。我知道对象属于 Class1 类型,并且我知道它的成员之一是 class1Instance.myDate,属于 DateTime 类型。

我想要做的是类似的事情:

DateTime.Compare( (Class1)x.myDate, (Class1)y.myDate);

但是这种方式铸造是行不通的。是否有以下替代方案?

Class1 x2 = x as Class1;
4

9 回答 9

4

尝试以下操作:

DateTime.Compare( ((Class1)x).myDate, ((Class1)y).myDate); 
于 2010-10-15T14:13:29.987 回答
4

这可能只是转换与方法调用的优先顺序。你有没有尝试过这样的事情?

DateTime.Compare( ((Class1)x).myDate, ((Class1)y).myDate);
于 2010-10-15T14:13:54.473 回答
2

这可能会让人毛骨悚然,但你可以这样做:

DateTime.Compare((x as Class1).myDate, (y as Class1).myDate))

于 2010-10-15T14:13:55.253 回答
2

最好的解决方案是扩展Comparer<Class1>.

Comparer<T>是一个抽象类,它实现了IComparer. 扩展它的好处是你不必实现非泛型IComparer.Compare方法;它已经由基类明智地实现了。

public class Class1Comparer: Comparer<Class1>
{
   public override int Compare(Class1 x, Class1 y)
   {
      //null-checks here          
      return DateTime.Compare(x.myDate, y.myDate);
   }
}
于 2010-10-15T14:18:49.657 回答
1

如果由于某种原因您不必比较异构类型,我总是建议将通用和更通用(嗯,嗯,“通用”是正确的英文单词,愚蠢的 .NET 术语)结合使用非通用方法在一个类中,从非泛型调用泛型。大多数泛型排序将偏爱泛型方法,但非泛型将在那里与非泛型类型(例如ArrayList)一起使用,以防万一出现。这也是两行的问题,在逻辑上是合理的,所以在这种情况下我不赞成 YAGNI。

检查空参数也是一个好主意,即使您不期望它们。我有几次因为没有这样做而被抓到,它们甚至可以被一些算法“人为地”引入。

public class Class1Comparer : IComparer<Class1>, IComparer
{
  public int Compare(Class1 x, Class1 y)
  {
    if(x == null)
      return y == null ? 0 : -1;
    if(y == null)
      return 1;
    return DateTime.Compare(x.myDate, y.myDate);
  }
  public int Compare(object x, object y)
  {
    //This has no type-checking because you said above it isn't needed. I would normally add some just in case.
    return Compare((Class1)x, (Class1)y);
  }
}
于 2010-10-15T16:35:00.257 回答
1
((Class1)x).myDate
于 2010-10-15T14:13:13.087 回答
1

无异常方式:

Class1 c1 = null;
if (x is Class1) c1 = (Class1)x;
于 2010-10-15T14:15:50.800 回答
1

如果您希望您的比较器是强类型的,请使用通用版本。

http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx

比较器

因此,您将其实现为:

public class MyComparer : IComparer<Class1>
{
    public int Compare( Class1 x, Class1 y )
    {
        // do comparison stuff here.
    }
}
于 2010-10-15T14:16:53.153 回答
1

你可能想做:

DateTime.Compare( ((Class1)x).myDate, (Class1)y).myDate);

您拥有它的方式是尝试将日期字段转换为 Class1

于 2010-10-15T14:17:15.323 回答