【问题标题】:Adapter class or multiple interface implementations for IComparer, IComparer<T>IComparer、IComparer<T> 的适配器类或多个接口实现
【发布时间】:2021-12-05 17:50:17
【问题描述】:

我需要在 WPF DataGrid 的 ListCollectionView 上使用自定义排序算法。 我创建了IComparer&lt;string&gt; 的实现,因为我使用字符串,但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 类中实现非泛型 IComparer 接口,它会调用泛型 Compare 方法。

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

【问题讨论】:

标签: c# wpf datagrid adapter icomparer


【解决方案1】:

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

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

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

没有

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

是的

MyComparer 上实现两者。我只在需要进行一些预处理或后处理时使用适配器/装饰器模式。

【讨论】:

  • 谢谢!这个问题帮助我更清楚地看到了情况。我什至不需要通用变体。
猜你喜欢
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多