2

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

例如:

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

有效,但涉及创建新的关键帧对象。

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

4

2 回答 2

0

无法进入 .net 实现,BinarySearch 要求您将对象传递给搜索,或者编写您自己的实现。

于 2013-03-22T13:07:51.120 回答
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));
于 2013-03-22T13:32:14.930 回答