IEqualityComparer将找到下一个最近的元素

时间:2014-06-26 04:37:43

标签: c# comparator binary-search

是否可以为IEqualityComparer写一个SortedList <double, GameObject>,以便返回下一个最接近的&#39; 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效率降低了吗?我刚刚使lookupinsertion效率降低了吗?

2 个答案:

答案 0 :(得分:0)

请使用以下程序进行此修复。是的,由于四舍五入会有一点开销。如果你检索0.45它将返回你A和1.55它将返回你C.

  class SortedListTest
    {
        public static void Test()
        {
            var list = new SortedList<double, string>(new MyComparer());

            list[0.00] = "A";
            list[1.00] = "B";
            list[2.00] = "C";

            Console.WriteLine(list[0.55]);
        }
        private static void Main()
        {
            SortedListTest.Test();
        }
    }

    internal class MyComparer : IComparer<double>
    {
        public int Compare(double x, double y)
        {
            return (int) (Math.Round(x) - Math.Round(y));
        }

    }

答案 1 :(得分:0)

我强烈怀疑这是可能的。在使用双精度索引Equals时,IQualityComparer的{​​{1}}方法甚至无法调用!

我建议创建一个继承自SortedList的新类,并覆盖Indexer(SortedList)。

此示例将返回下一个最高键的值。如果没有更高的密钥,则它将返回最高密钥的值:

[]