c#二进制搜索,不同的对象类型

本文关键字:对象 类型 二进制 搜索 | 更新日期: 2023-09-27 18:05:23

我正在用c#制作一款小游戏。在其中,我有关键帧对象,每个对象都有一个特定的时间,它们出现在一个排序列表中。我希望找到发生在特定时间之后的那个。如果不创建一个新的关键帧对象,然后在列表中搜索该对象,查看结果,然后使用该对象,是否存在一种语法上整洁的方法来执行搜索?

例如:

double time = 10.0;
Keyframe blah = new Keyframe(time);
int index = _keyframes.BinarySearch(null, blah);
if (index < 0) index = ~index;
if (index >= _keyframes.Length) return null;
return _keyframes[index];

工作,但涉及到创建一个新的关键帧对象。

谁有一个简洁的方法来做到这一点?

c#二进制搜索,不同的对象类型

您需要实现自己的方法来做到这一点。如下所示:

public static class Extensions
{
    public static TList BinaryFind<TList>(this IList<TList> list, Func<TList, int> comparer)
    {
        if (!list.Any())
            return default(TList);
        int pivot = list.Count()/2;
        TList pivotVal = list[pivot];
        int conditionResult = condition(pivotVal);
        if (conditionResult == 0) 
            return pivotVal;
        else
        {
            if (conditionResult < 0) 
                return BinaryFind<TList, TSearchArg>(list.Take(pivot).ToList(), condition);
            else
                return BinaryFind<TList, TSearchArg>(list.Skip(pivot).ToList(), condition);
        }
    }
}

那么你可以用

Keyframe result = _keyframes.BinaryFind(k => Double.Compare(k.Time, time));

没有办法进入。net实现,BinarySearch需要你传递一个对象来搜索,或者写一个你自己的实现