【发布时间】:2014-06-26 04:37:43
【问题描述】:
是否可以为SortedList <double, GameObject> 编写一个IEqualityComparer 以返回“下一个最近”double?
例如;
SortedList <double, GameObject> list = new SortedList <double, GameObject>(new MyComparer());
list[0.00] = go1;
list[1.00] = go2;
list[0.55]; // should return go2. Ie, find the next-closest key, value pair
// and return that
可以这样做吗?我是否使用IEqualityComparer 来实现这一点?
#region Comparator
public class MyComparer : IEqualityComparer<double> // should this be Pair<double, GameObject> instead?
{
public bool Equals(double a, double b)
{
return (Math.Abs(a-b) <= 0.01);
}
}
#endregion
PS:如果我添加我自己的自定义比较器 (IEqualityComparer) - 我的 SortedList 的排序和搜索算法是否仍保留为二分搜索?通过更改比较器,我是否使SortedList 的效率大大降低?我刚刚降低了lookup 和insertion 的效率吗?
【问题讨论】:
-
排序算法因 .NET 框架版本而异。相等比较器与排序无关。排序使用 IComparer
(或间接使用 IComparer、IComparable 、IComparable) -
你应该非常小心地做这样的事情,改变这样的接口的含义,特别是平等。我强烈建议您不要这样做,无论您最终要更改哪个界面。例如,如果
x == y和y == z那么你应该有x == z,但是如果你开始进行“足够接近”的比较,你可能不允许这样做。例如,如果“足够接近”介于 0.5 或更低之间,则0.5 == 1.0和1.0 == 1.5但0.5 != 1.5(使用新的 == 和 != 运算符)。 不要这样做!找到表达意图的不同方式。
标签: c# comparator binary-search