2

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

動作しますが、新しいキーフレームオブジェクトの作成が含まれます。

誰かがこれを行うための簡潔な方法を手に入れましたか?

4

2 に答える 2

0

BinarySearch では、.net の実装に入る方法はありません。BinarySearch では、オブジェクトを search に渡すか、独自の実装を作成する必要があります。

于 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 に答える