Question

Je le IComparer suivant défini pour les objets RegistryItem en boîte:

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

Je veux l'utiliser pour trier un ArrayList de RegistryItems en boîte (Il devrait vraiment être un List<RegistryItem>, mais c'est hors de mon contrôle).

ArrayList regItems = new ArrayList();
// fill up the list ...
BoxedRegistryItemComparer comparer = new BoxedRegistryItemComparer();
ArrayList.sort(comparer);

Cependant, la dernière ligne donne l'erreur du compilateur: « Impossible de convertir BoxedRegistryItemComparer à System.Collections.IComparer ». Je vous serais reconnaissant si quelqu'un pourrait me signaler mon erreur.

Était-ce utile?

La solution

BoxedRegistryItemComparer devrait mettre en œuvre System.Collections.IComparer à utiliser avec ArrayList.Sort. vous avez mis en System.Collections.Generic.IComparer<T> qui n'est pas la même chose.

Autres conseils

Vous avez défini un Générique-Comparer (IComparer<T>) au lieu d'un Comparer sans un type (IComparer) . ArrayList.Sort() un non attend générique IComparer.

ne peuvent pas être génériques casted types dans leurs équivalents non génériques.

Si vous avez une situation où vous n'avez aucun contrôle sur le ou Sorter Comparer, voici deux mini-classes qui peuvent convertir entre les deux types (non testé):

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

Peut-être est une béquille, mais cela fonctionne:

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

Une alternative au poste ci-dessus serait d'avoir votre classe deux interfaces comparateur mettre en œuvre, vous pouvez lancer IComparer pour IComparer si vous avez besoin à la fois.

public class MyComparer<T> : IComparer<T>, IComparer
public class BoxedRegistryItemComparer : IComparer {
...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top