我可以搜索排序列表吗?当它按我搜索的字段排序时速度更快吗?

发布于 2024-10-16 02:52:22 字数 648 浏览 7 评论 0原文

我认为在我搜索的字段上对 List 进行排序会使搜索速度更快。 假设对象模型中有一个 List 为 10.000,List 为 10.000。 我循环模型中的 Persons 列表,并希望找到具有属性 c.Owner == person.Name 的 Car。

public static Car Car(Model model, Person person)
        {
            return model.Cars.Find(
                 delegate(Car c)
                 {
                     return c.Owner.Equals(person.Name);
                 });
        }

对业主的汽车列表进行排序不会使循环更快吗?

我想也许我应该使用 BinarySearchBinarySearch 的重载不允许委托。当您必须将要查找的汽车作为参数提供时,BinarySearch 的 überhaupt 用途是什么?

I thougt that sorting a List<T> on the fields I search on would make the search faster.
Suppose I have a List<Person> of 10.000 and a List<Car> of 10.000 in an object Model.
I loop the Persons list in the Model and want to find the Car with the property c.Owner == person.Name.

public static Car Car(Model model, Person person)
        {
            return model.Cars.Find(
                 delegate(Car c)
                 {
                     return c.Owner.Equals(person.Name);
                 });
        }

Sorting the list of cars on property owner doesn't make the loop faster?

I thought maybe I should use BinarySearch but the overloads of BinarySearch do not permit delegates. What is überhaupt the use of BinarySearch when you have to give the Car you want to lookup as a parameter?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

川水往事 2024-10-23 02:52:22

List.BinarySearch不会不接受委托,但它确实重载< /a> 接受 IComparer。将该重载与适当的自定义比较器 (CarByOwnerComparer : IComparer) 结合使用,使其按照您希望的方式进行搜索。当然,请记住,列表必须已经使用该比较器进行排序才能允许二分搜索工作。如果您更喜欢编写委托(例如通过 lambda)来实现接口,请考虑使用可以在两者之间进行转换的转换器,例如 ProjectionComp此处提供了

但是,我建议您使用更合适的集合类,它可以通过键提供快速检索。例如,SortedList<,>SortedDictionary<,> 都将在 O(logn) 内完成这项工作。如果排序不是真正的要求,那么使用 Dictionary<,> 可能会容易得多。

List<T>.BinarySearch doesn't accept a delegate, but it does have an overload that accepts an IComparer<T>. Use that overload with the appropriate custom comparer (CarByOwnerComparer : IComparer<Car>) to get it to search the way you want it to. Of course, bear in mind that the list has to be already sorted with that comparer to allow binary-search to work. If you prefer writing a delegate (e.g. through a lambda) to implementing an interface, consider using a converter that can translate between the two, such as the ProjectionComparer provided here.

However, I would suggest that you use a more appropriate collection-class instead, which provides fast retrieval by key. For example, SortedList<,> and SortedDictionary<,> will both do the job in O(logn). If ordering is not a true requirement, it might be a lot easier to just go with Dictionary<,>.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文