5

我为盒装的 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”。如果有人能指出我的错误,我将不胜感激。

4

6 回答 6

9

BoxedRegistryItemComparer应该实现System.Collections.IComparerArrayList.Sort. 你实现System.Collections.Generic.IComparer<T>了这不是一回事。

于 2009-09-28T14:04:51.640 回答
7

您已经定义了Generic-Comparer ( IComparer<T>)而不是没有类型 ( IComparer)的 Comparer 。ArrayList.Sort()期望一个非泛型IComparer.

泛型类型不能转换为它们的非泛型等价物。

于 2009-09-28T14:00:26.937 回答
4

如果您无法控制比较器或排序器,这里有两个迷你类可以在两种类型之间转换(未经测试):

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);
    }
}
于 2010-12-21T06:14:51.787 回答
1

也许它是一个拐杖,但它有效:

            arrayList.Sort(Comparer<object>.Create(
            (x, y) => ((RegistryItem)x).Name.CompareTo(((RegistryItem)y).Name)));
于 2017-11-18T08:39:28.260 回答
0
public class BoxedRegistryItemComparer : IComparer {
...
}
于 2009-09-28T14:07:19.303 回答
0

上述帖子的替代方法是让您的比较器类实现两个接口,然后您可以将 IComparer<T> 转换为 IComparer 如果您需要两者。

public class MyComparer<T> : IComparer<T>, IComparer
于 2011-05-04T11:37:50.667 回答