这个问题涉及本质上相同的代码的两种不同实现。
首先,使用委托创建一个 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(使用前将#替换为@)