加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – .NET是否具有KeyValuePair的现有二进制搜索类

发布时间:2020-12-15 22:04:35 所属栏目:百科 来源:网络整理
导读:在我的Unity3d应用程序中,我需要检测用户选择的折线.确定这一点的简单方法是向每个GameObject(折线)添加一个碰撞器组件,然后我会在用户点击折线时知道.但这非常低效,因为我将拥有数千条折线. 所以我更有效的方法是将每个折线距离点(0,0)存储在List KeyValueP
在我的Unity3d应用程序中,我需要检测用户选择的折线.确定这一点的简单方法是向每个GameObject(折线)添加一个碰撞器组件,然后我会在用户点击折线时知道.但这非常低效,因为我将拥有数千条折线.

所以我更有效的方法是将每个折线距离点(0,0)存储在List< KeyValuePair< double,GameObject>>中.此列表将从最低距离到最高距离排序.当用户选择游戏中的一个点时,我将从(0,0)确定这个点的距离(D),然后使用’上界’二进制搜索来找到最接近该点的折线(即,使用距(0,0)的距离相近.

我的问题:在我去重新发明轮子和编码我自己的’上界’二进制搜索算法,元素排序等之前,是否有一个C#.NET类用于上边界二进制搜索,它将对我进行排序和搜索?

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

解决方法

您可以使用SortedList< double,GameObject>存储您的多边形而不是List< KeyValuePair< double,GameObject>> .或者您排序()您的列表<>一旦添加了所有多边形(第二个选项是最好的,如果你不打算后面添加其他多边形,显然).

@LeakyCode对IList的下限为provided an implementation,它将为您提供最接近的GameObject的索引(在列表中):

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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读