我正在实施
int IComparer.Compare(object x, object y);
我想要做的是:
DateTime.Compare( (Class1)x.myDate, (Class1)y.myDate);
但是以这种方式投射不起作用。以下是否有其他选择?
Class1 x2 = x as Class1;
答案 0 :(得分:4)
尝试以下方法:
DateTime.Compare( ((Class1)x).myDate, ((Class1)y).myDate);
答案 1 :(得分:4)
它可能只是cast和方法调用的优先顺序。你尝试过这样的事吗?
DateTime.Compare( ((Class1)x).myDate, ((Class1)y).myDate);
答案 2 :(得分:2)
这可能是分裂的头发,但你可以这样做:
DateTime.Compare((x as Class1).myDate, (y as Class1).myDate))
答案 3 :(得分: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);
}
}
答案 4 :(得分:1)
((Class1)x).myDate
答案 5 :(得分:1)
无例外方式:
Class1 c1 = null;
if (x is Class1) c1 = (Class1)x;
答案 6 :(得分:1)
如果您希望Comparer是强类型的,请使用通用版本。
http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx
的IComparer
所以你将它实现为:
public class MyComparer : IComparer<Class1>
{
public int Compare( Class1 x, Class1 y )
{
// do comparison stuff here.
}
}
答案 7 :(得分:1)
您可能想要这样做:
DateTime.Compare( ((Class1)x).myDate, (Class1)y).myDate);
你拥有它的方式是尝试将日期字段转换为Class1
答案 8 :(得分:1)
如果由于某种原因你不打算比较异构类型,我总是建议结合泛型和更通用(嗯,嗯“泛型”将是正确的英文单词,愚蠢的.NET术语)非 - 一类中的通用方法,从非泛型调用泛型。大多数通用排序都支持泛型方法,但非泛型方法将用于非泛型类型(例如ArrayList
),如果它出现的话。这也是2行的问题,并且在逻辑上是合理的,因此在这种情况下我不会与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);
}
}