这个问题涉及基本相同代码的两种不同实现。
首先,使用委托创建一个比较方法,该方法可以在对对象集合进行排序时用作参数:
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);
我的问题是:
- 这些实现中的每一个的优点和缺点是什么?
- 还有哪些方法可以利用这些实现中的每一个?
- 有没有办法以不需要复制代码的方式组合这些实现?
- 我可以只使用其中一种实现来实现二进制搜索和替代集合排序吗?