1

floatのキーと値のペアをintに格納するコレクションが必要です(floatがキーです)。次に、番号が最も小さいキーと値のペアを見つけたいと思います。したがって、基本的に、関連付けられている最も低いfloatキーを使用してint値を取得したいと思います。

おそらく、キーに基づいてそれらを順序付けたままにし、インデックス0でオブジェクトを取得するために、キーにインデックスを付けることができるコレクションが適切でしょうか?しかし、どこからこれを探し始めるのかわかりません。

4

2 に答える 2

9

あなたはSortedDictionaryを試すことができます。その上で.Keysを呼び出すと、ソートされたキーのコレクションが返されます。次に、LINQ .First()関数を使用して、コレクションの最初のキーを取得できます。次に例を示します。

var mySortedDictionary = new SortedDictionary<float, int>();

// ...
// Add some values to dictionary
// ...

// Note, you will need the System.Linq namespace for First()
float firstKey = mySortedDictionary.Keys.First();
int firstValue = mySortedDictionary[firstKey];
// If you just need the value:
int firstValue2 = mySortedDictionary.Values.First();

最初または最後のキー以外のキーを取得する必要がある場合は、LINQ .ToArray()または.ToList()関数を使用して、次のようにインデックス可能な配列またはリストを返すことができます。

float[] indexableKeys = mySortedDictionary.Keys.ToArray();
int[] indexableValues = mySortedDictionary.Values.ToArray();

さらに、次のコードはコレクションを反復処理し、すべてのKeyValuePairをソートされた順序で提供します。

foreach (var pair in mySortedDictionary)
{
    int key = pair.Key;
    // Do stuff with key...
    object value = pair.Value;
    // Do stuff with value...
}

別の方法として、インデックス付け可能なSortedListを使用することもできます。これを使用するには、次のコードが必要です。

var mySortedList = new SortedList<float, int>();
// ...
// Add some values to sortedlist
// ...
int firstValue = mySortedList.Values[0];

注:これらのいずれかをベンチマークする機会がなかったため、どちらが優れているかわかりません。ソートされたコレクションを使用すると、通常のコレクションよりも確実にオーバーヘッドが大きくなります。どのキーが最初のキーであるかを知る必要があるだけの場合は、ディクショナリと、private float first;どのキーが最初のキーであるかを格納するプライベートフィールドを含むカスタムクラスを作成するのが最善の方法です。そのクラスに追加すると、KeyValuePairがディクショナリに追加され、キーがfirst変数よりも小さいかどうか(またはディクショナリにキーがないかどうか)が確認されます。その場合first、新しいキーに設定されます。値を削除すると、ディクショナリから再び削除されます。キーがあなたと等しい場合first値の場合、Dictionary.Keysコレクションを並べ替えて、最初に新しいものを見つける必要があります。これはおそらく最高のパフォーマンスを発揮しますが、クラスを自分で作成する必要があります。

注: いくつかのベンチマークを実行した後、SortedDictionaryの削除は高速ですが、SortedListの追加とキーによるインデックス作成の方が高速であることがわかりました。 これは、通常の辞書に1,000,000個のkeyValueペアを入力することによって行われました(キーはランダムな順序で入力されるようにシャッフルされました)。そして私は・・・それから私は:

  • これらのペアのそれぞれを、ソートされた両方のコレクションに追加しました
  • ソートされた両方のコレクションの各キーでルックアップを実行しました
  • ソートされた両方のコレクションでRemove(Key)を呼び出して、各ペアを削除しました

SortedListは、追加またはインデックス作成時に約2倍高速でしたが、各要素を削除するのに約1000倍の時間がかかりました。

于 2012-06-08T14:32:12.330 に答える
0

もちろん、完全にソートされたデータ構造を使用できます。ただし、「完全にソートされた」部分には、もちろんオーバーヘッドが伴います。

最も低いキーのみを取得する必要がある場合は、通常、「優先キュー」が最適なデータ構造です。ここで適切な質問があります。

于 2012-06-08T14:39:06.077 に答える