在我搜索的字段上排序后,我可以更快地搜索已排序的List <T>吗?

Ger*_*ard 3 c# sorting find binary-search

我认为List<T>在我搜索的字段上排序会使搜索更快.假设我在对象模型中有List<Person>10.000和List<Car>10.000.我循环模型中的人员列表,并希望找到具有属性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);
                 });
        }
Run Code Online (Sandbox Code Playgroud)

对财产所有者的汽车列表进行排序不会使循环更快?

我想也许我应该使用,BinarySearch但重载BinarySearch不允许代表.BinarySearch当您必须将要查找的汽车作为参数进行查询时,überhaupt的用途是什么?

Ani*_*Ani 5

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

但是,我建议您使用更合适的集合类,它可以通过密钥快速检索.例如, SortedList<,>并且SortedDictionary<,>都将完成工作 O(logn).如果订购不是真正的要求,那么可能更容易Dictionary<,>.