微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

在我的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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐