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

本文关键字:元素 IEqualityComparer 最接近 下一个 | 更新日期: 2023-09-27 18:10:16

是否可以为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的效率大大降低?我是否使lookupinsertion的效率降低了?

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

请使用以下程序进行修复。是的,由于四舍五入,会有一些开销。如果你检索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));
        }
    }

我强烈怀疑这是不可能的。当用双精度索引SortedList时,IQualityComparerEquals方法甚至不会被调用!

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

这个例子将返回下一个最高键的值。如果没有更高的键,那么它将返回最高键的值:

   class Program
   {
      static void Main(string[] args)
      {
         var list = new MySortedList();
         list[0.5] = "A";
         list[1.0] = "B";
         list[3.0] = "C";
         Console.WriteLine(list[-0.6]); // writes: A
         Console.WriteLine(list[0.1]); // writes: A
         Console.WriteLine(list[0.6]); // writes: B
         Console.WriteLine(list[1.1]); // writes: C
         Console.WriteLine(list[1.2]); // writes: C
         Console.WriteLine(list[4.0]); // writes: C
      }
   }
   class MySortedList : SortedList<double, string>
   {
      new public string this[double key]
      {
         get
         {
            double newKey = Keys.FirstOrDefault(p => p >= key);
            if (!Keys.Contains(newKey)) newKey = Keys.Max();
            return base[newKey];
         }
         set
         {
            base[key] = value;
         }
      }
   }