5

整数のシーケンスを持ついくつかのクラスがあります。これらのシーケンスは、シーケンス内の数値がまだ使用されていないかどうかをチェックする別のクラスに登録されています。

シーケンスは、番号から別の番号に移動する、最も連続したものです。

今のところ、単純なリストを使用してきました。つまり、シーケンスが 5000 から 15000 までを表す場合、リストには 10000 個の要素が存在します。単純な要素で範囲を表すことができる、より適切なものに置き換えたいと思います。

私の特定のケースでは、これらの範囲がオブジェクト (シーケンスの元のクラス) を表すようにしたいので、数値を検索するときに、各クラスを調べてそれらがあるかどうかを確認するのではなく、その元にアクセスできます。探している番号が含まれています。

これが私が期待する結果を含む私の擬似コードです:

/* int is the integer type, while string is the "tag" object */
var animals = new IntRangeArray<int, string>();

animals.Add(1, "dog");
// [0] begin: 1, end: 1, object: "dog"

animals.Add(2, "dog");
// [0] begin: 1, end: 2, object: "dog"

/* AddRange with C#7.0 ValueTuple */
animals.AddRange((4,14), "dog");
// [0] begin: 1, end: 2, object: "dog"
// [1] begin: 4, end: 14, object: "dog"

animals.Add(3, "dog");
// [0] begin: 1, end: 14, object: "dog" 
/* All sequences have been merged because they are contiguous and have the same tag */

animals.AddRange( new int[]{ 15, 17, 18, 19 }, "dog");
// [0] begin: 1, end: 15, object: "dog"
// [1] begin: 17, end: 19, object: "dog"

animals.Add(16, "cat"); 
// [0] begin: 1, end: 15, object: "dog"
// [1] begin: 16, end: 16, object: "cat"
// [2] begin: 17, end: 19, object: "dog"

animals.Remove(8);
// [0] begin: 1, end: 7, object: "dog"
// [1] begin: 9, end: 15, object: "dog"
// [2] begin: 16, end: 16, object: "cat"
// [3] begin: 17, end: 18, object: "dog"

animals.At(11);
// struct { Begin = 9, End = 15, Tag = "dog" }

animals.RemoveWithTag("dog");
// [0] begin: 16, end: 16, object: "cat"

animals.TagOf(16);
// "cat"

この動作を実装する .NET Framework 内のクラスが見つからなかったため、これを実装する方法や、既存の実装があるかどうかを知りたいです。

4

4 に答える 4