比较对象的不同实现的优点/缺点

2024-02-11

这个问题涉及本质上相同的代码的两种不同实现。

首先,使用委托创建一个 Comparison 方法,该方法可以在对对象集合进行排序时用作参数:

class Foo
{
    public static Comparison<Foo> BarComparison = delegate(Foo foo1, Foo foo2)
    {
        return foo1.Bar.CompareTo(foo2.Bar);
    };
}

当我想要一种以不同于 CompareTo 函数提供的方式对 Foo 对象集合进行排序的方法时,我会使用上面的方法。例如:

List<Foo> fooList = new List<Foo>();
fooList.Sort(BarComparison);

二、使用IComparer:

public class BarComparer : IComparer<Foo>
{
    public int Compare(Foo foo1, Foo foo2)
    {
        return foo1.Bar.CompareTo(foo2.Bar);
    }
}

当我想在 Foo 对象集合中对 Foo 对象进行二分搜索时,我使用上面的方法。例如:

BarComparer comparer = new BarComparer();
List<Foo> fooList = new List<Foo>();
Foo foo = new Foo();
int index = fooList.BinarySearch(foo, comparer);

我的问题是:

  • 这些实现方式各自的优点和缺点是什么?
  • 还有哪些方法可以利用这些实现?
  • 有没有办法以不需要重复代码的方式组合这些实现?
  • 我可以仅使用其中一种实现来实现二分搜索和替代集合排序吗?

在性能方面,这两种选择确实没有任何优势。这实际上是一个便利性和代码可维护性的问题。选择您喜欢的选项。话虽这么说,所讨论的方法稍微限制了您的选择。

您可以使用IComparer<T>接口用于List<T>.Sort http://msdn.microsoft.com/en-us/library/234b841s(v=VS.90).aspx,这将允许您不重复代码。

很遗憾,二分查找 http://msdn.microsoft.com/en-us/library/3f90y839(v=VS.90).aspx不实现使用的选项Comparison<T>,所以你不能使用Comparison<T>该方法的委托(至少不是直接委托)。

如果你真的想使用Comparison<T>对于两者,你可以做一个通用的IComparer<T>实施花了Comparison<T>在其构造函数中委托,并实现IComparer<T>.

public class ComparisonComparer<T> : IComparer<T>
{
    private Comparison<T> method;
    public ComparisonComparer(Comparison<T> comparison)
    {
       this.method = comparison;
    }

    public int Compare(T arg1, T arg2)
    {
        return method(arg1, arg2);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较对象的不同实现的优点/缺点 的相关文章

随机推荐