我有一个带有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的日期来比较它们。
要处理inFromTime
的BinarySearch
参数,您可以创建一个具有正确TimeStamp
的虚拟事件,并将该虚拟事件传递给BinarySearch
。
另外,只是为了确保:列表是否在时间字段上排序?否则,binarysearch将无法正常工作。
编辑
这个问题比我最初想的要复杂。一个对您有帮助的解决方案是:
不幸的是,没有内置BinarySearch extension method,所以您必须编写自己的。如果您编写自己的搜索,将其放在扩展方法中可能不值得付出额外的精力。在那种情况下,仅自己在EventList类中实现自定义BinarySearch算法可能是您可以做的最好的事情。
另一个选择是,如果存在某种形式的BinarySearch接受了一个委托(delegate),该委托(delegate)从T中提取了相关的 key ,但是这也不可用。
关于C#通过T的成员对list <T>进行二进制搜索,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2565844/