Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET是否有KeyValuePair的现有二进制搜索类<;K、 V>;_C#_.net_Binary Search - Fatal编程技术网

C# .NET是否有KeyValuePair的现有二进制搜索类<;K、 V>;

C# .NET是否有KeyValuePair的现有二进制搜索类<;K、 V>;,c#,.net,binary-search,C#,.net,Binary Search,在我的Unity3d应用程序中,我需要检测用户选择的多段线。确定这一点的简单方法是向每个游戏对象(多段线)添加一个碰撞器组件,这样每当用户单击多段线时,我就知道了。但这是难以置信的低效,因为我将有数千条多段线 因此,我更有效的方法是将距点(0,0,0)的每条多段线存储在列表中。此列表将从最低距离到最高距离排序。当用户在游戏中选择一个点时,我将确定该点与(0,0,0)之间的距离(D),然后使用“上界”二进制搜索查找最接近该点的多段线(即,与(0,0,0)的距离相似) 我的问题:在我重新发明轮子并编

在我的Unity3d应用程序中,我需要检测用户选择的多段线。确定这一点的简单方法是向每个游戏对象(多段线)添加一个碰撞器组件,这样每当用户单击多段线时,我就知道了。但这是难以置信的低效,因为我将有数千条多段线

因此,我更有效的方法是将距点(0,0,0)的每条多段线存储在
列表中。此列表将从最低距离到最高距离排序。当用户在游戏中选择一个点时,我将确定该点与(0,0,0)之间的距离(D),然后使用“上界”
二进制搜索
查找最接近该点的多段线(即,与(0,0,0)的距离相似)

我的问题:在我重新发明轮子并编写我自己的“上界”二进制搜索算法、元素排序等之前,是否有一个用于上界二进制搜索的C#NET类可以为我排序和搜索


我知道方法
List(T).BinarySearch()
,但是否由我来确保
List
正确排序?如果我的列表没有排序,并且该方法需要对每个方法调用的列表进行排序,那么这可能会非常低效。

您是否应该首先使用
list.sort
方法对列表进行排序,并在类中实现我们自己的
IComparer
。我认为这是最好的办法


您可以使用
排序列表
来存储已排序的多边形,而不是
列表
。或者,在添加所有多边形后,对
列表进行一次排序()(显然,如果以后不添加其他多边形,则第二个选项是最好的)

@
IList
的下限泄漏码,它将为您提供最接近的
游戏对象的索引(在您的列表中):

private static int BinarySearch<T>(IList<T> list, T value)
{
    if (list == null)
        throw new ArgumentNullException("list");
    var comp = Comparer<T>.Default;
    int lo = 0, hi = list.Length - 1;
    while (lo < hi) {
            int m = (hi + lo) / 2;  // this might overflow; be careful.
            if (comp(list[m], value) < 0) lo = m + 1;
            else hi = m - 1;
    }
    if (comp(list[lo], value) < 0) lo++;
    return lo;
}

public static int FindFirstIndexGreaterThanOrEqualTo<T,U>
                          (this SortedList<T,U> sortedList, T key)
{
    return BinarySearch(sortedList.Keys, key);
}
private静态int二进制搜索(IList列表,T值)
{
if(list==null)
抛出新的ArgumentNullException(“列表”);
var comp=比较器默认值;
intlo=0,hi=list.Length-1;
while(lo
仅确认MSDN中的最后一段:“列表必须已根据比较器实现进行排序;否则,结果不正确。”您是否尝试过使用
SortedList
/
SortedDictionary
?来自MSDN:“SortedList泛型类是一个具有O(logn)检索的键/值对数组”。但请注意,只能插入唯一的键。