1

検索対象の値以下の配列値のインデックスを返す「検索」列を作成しようとしています。これは私の試みであり、うまくいくようですが、もっとクリーンな方法があるかどうか疑問に思っていましたか?

// Sorted
float[] ranges = new float[]
  {
     0.8f,
     1.1f,
     2.7f,
     3.9f,
     4.5f,
     5.1f,
  };


private int GetIndex(float lookupValue)
{
    int position = Array.BinarySearch(ranges, lookupValue);
    if (position < 0)
    {
        // Find the highest available value that does not
        // exceed the value being looked up.
        position = ~position - 1;
    }

    // If position is still negative => all values in array 
    // are greater than lookupValue, return 0
    return position < 0 ? 0 : position;
}

ありがとう。

4

2 に答える 2

3

いいえ、これはかなり良いアプローチだと思います。

私が変更できる唯一のことは、クラス変数を参照するプライベート関数ではなく、配列の拡張メソッドにすることです。次に、一般的になり、1 つのクラスに結び付けられなくなり、構文もきれいになります。ranges.GetIndex(...)

このようなもの:

public static class Extensions
{
    public static int GetIndex<T>(this T[] ranges, T lookupValue)
    {
        // your code here
    }
}

もちろん、これはソートされた配列でのみ機能することを覚えておく必要があります...

于 2010-08-10T20:04:58.223 に答える
1

通常のforループを使用できます(データが順序付けられていると仮定します)。クリーンかどうかはわかりませんが、大量のデータに対しては確かに効果的ではありません。個人的に私はあなたが持っているBinarySearchに行きます。

int GetIndex(IList<float> ranges, float target)
{
    for (int i = 0; i < ranges.Count; i++)
    {
        if(ranges[i] < target) continue;
        if (ranges[i] >= target) return i;
    }
    return 0;
}
于 2010-08-10T20:09:39.257 に答える