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

时间:2013-03-22 12:57:58

标签: c#

我正在用C#做一个小游戏。在其中,我在一个排序列表中有Keyframe对象,每个对象都有一个特定的时间。我希望找到在特定时间之后发生的那个。在没有创建新的关键帧对象的情况下,然后在列表中搜索该对象,结果然后使用该对象,是否存在语法 neat 方式来执行搜索?

例如:

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];

工作但涉及创建新的Keyframe对象。

任何人都有简洁的方法来做到这一点?

2 个答案:

答案 0 :(得分:0)

No。进入.net实现,BinarySearch要求你传递一个对象进行搜索,要么写一个你自己的实现。

答案 1 :(得分:0)

您需要实现自己的方法来执行此操作。如下所示:

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