我有一个带有Event成员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(所以-一种Event类型)作为参数,而我想基于T的成员-TimeStamp进行搜索。

什么是解决这个问题的好方法?

最佳答案

我认为您的comparer函数已经处于正确的位置。它通过比较两个T的日期来比较它们。
要处理inFromTimeBinarySearch参数,您可以创建一个具有正确TimeStamp的虚拟事件,并将该虚拟事件传递给BinarySearch
另外,只是为了确保:列表是否在时间字段上排序?否则,binarysearch将无法正常工作。
编辑
这个问题比我最初想的要复杂。一个对您有帮助的解决方案是:

  • 制作一个适配器类,将您的EventList公开为IList。
  • 在IList上使用BinarySearch扩展方法进行搜索。

  • 不幸的是,没有内置BinarySearch extension method,所以您必须编写自己的。如果您编写自己的搜索,将其放在扩展方法中可能不值得付出额外的精力。在那种情况下,仅自己在EventList类中实现自定义BinarySearch算法可能是您可以做的最好的事情。
    另一个选择是,如果存在某种形式的BinarySearch接受了一个委托(delegate),该委托(delegate)从T中提取了相关的 key ,但是这也不可用。

    关于C#通过T的成员对list <T>进行二进制搜索,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2565844/

    10-11 10:33