将找到下一个最接近的元素的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
的效率大大降低?我是否使lookup
和insertion
的效率降低了?
请使用以下程序进行修复。是的,由于四舍五入,会有一些开销。如果你检索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
时,IQualityComparer
的Equals
方法甚至不会被调用!
我建议创建一个继承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;
}
}
}