1

基本的に次のように機能するデータ構造を探しています。

  • 構造は、値の順序付けられたシーケンスです。
  • 挿入された各値は、前のインデックスよりも大きいインデックスを要求し、再利用されず、シフトしません(永続的です)。
  • 特定のインデックスの前にあるすべてのアイテムは、1回の操作で構造から削除できます。
  • まだ生きているすべてのアイテムは、それらのインデックスによって到達可能です。
  • 2つのインデックス間のすべてのアイテムをバッチで取得できます。(新しいアイテムが追加されている間にそれらを取得できれば、それも素晴らしいことです。)

上記は私の最良の実装の推測です。私が実際に必要としているプロパティは、ある種のブックマーク値を保持し、新しいアイテムを見逃すことなく読み取ることができるコンシューマーを持ち、特定のタイムスタンプより前にアイテムをクリアできるようにすることです。ただし、データ構造はタイムスタンプについて知る必要はありません。特定のインデックスの前にすべてを削除できることは問題ありません。

この構造を実装する方法は、アイテムカウントが開始する場所の整数を保持し、次にアイテムのリストを直接保持するか、リストセグメントのリストを保持することです。ある種のプリミティブ整数であるインデックスはラップしますが、プログラムの寿命の現実的なタイムスパンの数倍以内にはなりません。

私が知っている最も近い構造は、LMAXディスラプターからの特定のリングバッファーです。ただし、その構造は、消費者が遅れすぎて私の目的に合わない場合にもブロックされます。コンシューマーはバッチ指向であり、CPU時間を頻繁に取得しない場合があります。Disruptorは、リングバッファに対して継続的に機能する専用の論理タスクで最適に機能します。

だから私が尋ねている質問は次のとおりです:

  • これには名前がありますか?
  • C#または他の言語用の実装はありますか?
  • 私のユースケースに代わるより良い方法はありますか?
4

1 に答える 1

1

そのように機能するプリセットコレクションはありませんが、System.Collections.CollectionBaseを拡張してカスタムコレクションオブジェクトを作成できます。

public class MyCollection : CollectionBase
{
    public MyCollection() { }

このコレクションベースオブジェクトには、Add()メソッドを追加するなど、任意の方法で公開できるListプロパティが含まれています。

public int Add(Object o) // could by anything
{
    return List.Add(o);
}

新しいコレクションを返すGetRange(int start、int length)を作成し、戻りコレクションを埋めるのと同じように、ベースコレクションから削除することができます。

于 2012-10-23T13:05:27.567 に答える