5

memberEventを持つ基本クラスがDateTimeありTimeStampます。他の多くのイベント クラスがこれから派生します。

イベントのリストをすばやく検索できるようにしたいので、二分検索を使用したいと思います。

(リストデータはタイムスタンプでソートされていますが、同時に発生したイベントのタイムスタンプが重複している可能性があります)

だから私はこのようなものを書き始めました:

public class EventList<T> : List<T> where T : Event
{
   private IComparer<T> comparer = (x, y) => Comparer<DateTime>.Default.Compare(x.TimeStamp, y.TimeStamp);

   public IEnumerable<T> EventsBetween(DateTime inFromTime, DateTime inToTime)
   {
       // Find the index for the beginning. 
       int index = this.BinarySearch(inFromTime, comparer);

       // BLAH REST OF IMPLEMENTATION
   }
}

問題は、BinarySearch が T (つまり型) のみをパラメーターとして受け入れるのに対し、Tのメンバー( TimeStampEvent ) に基づいて検索したいことです。

これにアプローチする良い方法は何でしょうか?

4

5 に答える 5

1

あなたはすでにあなたのcomparer機能で正しい道を進んでいると思います。2 つの T の日付を比較して比較します。

inFromTimeパラメータを処理するBinarySearchには、正しい を持つダミー イベントを作成し、TimeStampそのダミーを に渡しBinarySearchます。

また、確認のために、リストは時間フィールドでソートされていますか? そうしないと、バイナリサーチは機能しません。

編集

この問題は、私が最初に考えたよりも複雑です。あなたに役立つ解決策は次のとおりです。

  • EventList を IList として公開するアダプター クラスを作成します。
  • 検索を行うには、IList で BinarySearch 拡張メソッドを使用します。

残念ながらBinarySearch 拡張メソッドは組み込まれていないため、独自に作成する必要があります。独自の検索を作成する場合、それを拡張メソッドに入れるために余分な努力をする価値はないかもしれません。その場合、EventList クラスで独自の BinarySearch アルゴリズムを自分で実装することが、おそらく最善の方法です。

別のオプションは、T から関連するキーを抽出するデリゲートを受け入れる形式の BinarySearch があった場合ですが、それも利用できません。

于 2010-04-02T09:17:45.133 に答える
0
public class EventList<TEvent, TData>
   : List<TEvent> where TEvent : Event, TData: DataTime
{
   class Comparer : IComparer<TData> { } // as JaredPar mentioned above

   public IEnumerable<TEvent> EventsBetween(TData from, TData to) { }
}
于 2010-04-02T09:58:30.500 に答える
0

List の代わりにSortedListを基本クラスとして使用することを検討してください。その後、 IndexOfKeyメソッドを使用して、指定した TimeStamp を検索できます。そのメソッドは二分探索を行います。

于 2010-04-02T10:36:47.580 に答える
0

最も簡単な方法は、 を実装する小さなヘルパー クラスを定義することIComparer<T>です。

public class CompUtil : IComparer<T> {
  public int Compare(T left, T right) { 
    return left.TimeStamp.CompareTo(right.TimeStamp);
  }
}

その後、次のように使用できます

int index = this.BinarySearch(inFromTime, new CompUtil());
于 2010-04-02T09:20:35.253 に答える
0

Eventクラスに並べ替えたいプロパティが含まれている場合、アプローチは問題ありません。コンパイラは、渡される T が何であれ、それが Event から継承され、DateTime プロパティが含まれていることを確認できます。に DateTime プロパティが含まれていない場合Eventは、おそらくそれをイベントに追加するか、検索に必要なプロパティを含むより具体的な型になるように T を制約する必要があります。

BinarySearch を適用する前に、リストがソートされていることを確認してください。

于 2010-04-02T09:23:54.123 に答える