我为装箱的RegistryItem对象定义了以下IComparer:
public class BoxedRegistryItemComparer : IComparer<object>
{
public int Compare(object left, object right)
{
RegistryItem leftReg = (RegistryItem)left;
RegistryItem rightReg = (RegistryItem)right;
return string.Compare(leftReg.Name, rightReg.Name);
}
}
我想用它来对装箱的RegistryItems 的ArrayList 进行排序(它实际上应该是一个List <RegistryItem
>,但这超出了我的控制范围)。
ArrayList regItems = new ArrayList();
// fill up the list ...
BoxedRegistryItemComparer comparer = new BoxedRegistryItemComparer();
ArrayList.sort(comparer);
但是,最后一行给出了编译器错误:“无法从 BoxedRegistryItemComparer 转换为 System.Collections.IComparer”。如果有人能指出我的错误,我将不胜感激。
BoxedRegistryItemComparer
应该实现System.Collections.IComparer
与 一起使用ArrayList.Sort
。你实现的System.Collections.Generic.IComparer<T>
不是同一件事。
您定义了一个Generic-Comparer ( IComparer<T>
)而不是没有类型的 Comparer ( IComparer
)。ArrayList.Sort()
期望一个非通用的IComparer
.
泛型类型不能转换为其非泛型等价物。
如果您无法控制比较器或排序器,这里有两个迷你类可以在两种类型之间进行转换(未经测试):
private class GenericComparer<T> : IComparer<T>
{
IComparer _Comparer;
public GenericComparer(IComparer comparer)
{
_Comparer = comparer;
}
public int Compare(T a, T b)
{
return _Comparer.Compare(a, b);
}
}
private class NonGenericComparer<T> : IComparer
{
IComparer<T> _Comparer;
public NonGenericComparer(IComparer<T> comparer)
{
_Comparer = comparer;
}
public int Compare(object a, object b)
{
return _Comparer.Compare((T)a, (T)b);
}
}
也许它是一个拐杖,但它确实有效:
arrayList.Sort(Comparer<object>.Create(
(x, y) => ((RegistryItem)x).Name.CompareTo(((RegistryItem)y).Name)));
上述帖子的替代方法是让您的比较器类实现这两个接口,然后如果您需要这两个接口,则可以将 IComparer<T> 强制转换为 IComparer。
public class MyComparer<T> : IComparer<T>, IComparer
public class BoxedRegistryItemComparer : IComparer {
...
}