当前位置: 首页 > 编程语言 > C#

C#binarysearch被T成员列出

时间:2023-04-10 19:43:33 C#

C#binarysearch被T成员列出我有一个基类Event,带有DateTime成员TimeStamp。许多其他事件类将派生自此。我希望能够快速搜索事件列表,所以我想使用二进制搜索。(列表数据按时间戳排序,但同时发生的事件可能有重复的时间戳)所以我开始写这样的东西:publicclassEventList:ListwhereT:Event{privateIComparercomparer=(x,y)=>比较器.Default.Compare(x.TimeStamp,y.TimeStamp);publicIEnumerableEventsBetween(DateTimeinFromTime,DateTimeinToTime){//找到开头的索引。intindex=this.BinarySearch(inFromTime,比较器);//BLAHRESTOFIMPLEMENTATION}}问题是BinarySearch只接受T(所以-事件类型)作为参数,而我想根据T-TimeStamp的成员进行搜索。解决这个问题的好方法是什么?我认为您以正确的方式使用了comparerfunction。它通过比较来比较两个T日期。要处理BinarySearch的inFromTime参数,您可以使用正确的时间戳创建一个虚拟事件并将该虚拟事件传递给BinarySearch。另外,只是为了确保:列表是否按时间字段排序?否则binarysearch将无效。编辑这个问题比我想象的要复杂。一个可能对您有帮助的解决方案是:不幸的是,BinarySearch没有内置的扩展方法,因此您必须自己编写。如果您正在编写自己的搜索,将其放入扩展方法中可能不值得付出额外的努力。在这种情况下,您可以通过自己在EventList类中简单地实现自定义BinarySearch算法来做到最好。另一种选择是采用一种BinarySearch形式,它接受从T中提取相关密钥的代理,但这也不可用。最简单的方法是定义一个实现IComparer的小助手类。publicclassCompUtil:IComparer{publicintCompare(Tleft,Tright){returnleft.TimeStamp.CompareTo(right.TimeStamp);然后你可以像下面这样使用它intindex=this.BinarySearch(inFromTime,newCompUtil());如果您的Event类包含要排序的属性,那么您的方法就可以了。然后编译器可以验证传入的T是什么,它将继承自Event并包含DateTime属性。如果Event不包含DateTime属性,您可能希望将其添加到事件中,或将T限制为包含搜索所需属性的更具体的类型。请务必在应用BinarySearch之前对列表进行排序。publicclassEventList:ListwhereTEvent:Event,TData:DataTime{classComparer:IComparer{}//正如上面提到的JaredParpublicIEnumerableEventsBetween(TDatafrom,TDatato){}}也许你可以考虑使用SortedList作为基类而不是List.然后,您可以使用IndexOfKey方法搜索指定的TimeStamp。此方法执行二进制搜索。以上就是C#学习教程:C#binarysearch为T成员整理分享,如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: