2009-09-28 94 views
2

我有盒装RegistryItem对象定义了如下的IComparer:“无法转换为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”。如果有人能指出我的错误,我将不胜感激。

回答

6

BoxedRegistryItemComparer应执行System.Collections.IComparerArrayList.Sort一起使用。你执行System.Collections.Generic.IComparer<T>这不是一回事。

0
public class BoxedRegistryItemComparer : IComparer { 
... 
} 
3

如果你有一个情况下,你没有对比较程序或任何分拣机控制,这里是可以在两种类型之间的转换(未经测试)个mini-类:

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

以上帖子的替代方法是让您的比较器类实现这两个接口,然后您可以将IComparer <T>投射到IComparer,如果您同时需要这两个接口。

public class MyComparer<T> : IComparer<T>, IComparer 
0

也许是一个拐杖,但它的工作原理:

  arrayList.Sort(Comparer<object>.Create(
      (x, y) => ((RegistryItem)x).Name.CompareTo(((RegistryItem)y).Name))); 
相关问题