Adapter class 或 IComparer、IComparer<T> 的多个接口实现

Adapter class or multiple interface implementations for IComparer, IComparer<T>

我需要在 WPF DataGrid 的 ListCollectionView 上使用自定义排序算法。 我创建了 IComparer<string> 的实现,因为我使用字符串,但是 ListCollectionViewCustomSort 属性 只采用非通用 IComparer 实现:

listCollectionView.CustomSort = new MyComparer(); // this wont work

因为我的比较逻辑是专门针对字符串的,而我需要一个 IComparer 实例,所以我正在考虑像这样创建一个 MyComparerAdapter 适配器:

public class MyComparerAdapter : IComparer
{
    private readonly IComparer<string> _innerComparer = new MyComparer();

    public int Compare(object a, object b)
    {
        return _innerComparer.Compare((string)a, (string)b);
    }
}

但我还不如在 MyComparer class 中实现非通用 IComparer 接口,这将调用通用 Compare 方法。

哪种解决方案更可取,为什么?适配器会是一个无用的额外组件吗?同时实现 IComparer 的泛型和非泛型方法有缺点吗?

我发现少即是多。实现最低限度并仅在需要时添加。

翻译成你的情况,这取决于...

您是否看到自己在任何地方(在您的视图模型中)使用通用变体

没有

CollectionView 本质上是基于对象的。仅实施 IComparer 就足够了。

MyComparer 上实施两者。我只在需要进行一些预处理或后处理时才使用 Adapter / Decorator 模式。