2009-09-28 88 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))); 
相關問題