是否可以为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
效率降低了吗?我刚刚使lookup
和insertion
效率降低了吗?
答案 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
)。
此示例将返回下一个最高键的值。如果没有更高的密钥,则它将返回最高密钥的值:
[]