Pyg*_*gmy 5 c# binary search class member
我有一个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
}
}
Run Code Online (Sandbox Code Playgroud)
问题是BinarySearch只接受T(所以 - Event类型)作为参数,而我想基于T 的成员 - TimeStamp进行搜索.
什么是一个很好的方法来解决这个问题?
我认为您的comparer职能已经走在正确的道路上。它通过比较两个 T 的日期来进行比较。
要处理inFromTime参数,BinarySearch您可以创建一个具有正确参数的虚拟事件TimeStamp并将该虚拟传递给BinarySearch。
另外,只是为了确保:列表是否按时间字段排序?否则二分查找将无法工作。
这个问题比我最初想象的要复杂。对您有帮助的解决方案是:
不幸的是,没有内置的BinarySearch 扩展方法,因此您必须编写自己的扩展方法。如果您编写自己的搜索,则可能不值得付出额外的努力将其放入扩展方法中。在这种情况下,您自己在 EventList 类中实现自定义 BinarySearch 算法可能是最好的选择。
另一种选择是,如果有一种 BinarySearch 接受从 T 中提取相关密钥的委托,但这也不可用。