2011-02-07 76 views
3

我想对搜索的字段排序List<T>会使搜索更快。 假设我在对象模型中有一个为10.000的List<Person>和10.000的List<Car>。 我循环模型中的人员列表,并希望找到具有属性c.Owner == person.Name的汽车。当我在搜索的字段上排序时,可以更快地搜索排序的列表<T>吗?

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

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

我想也许我应该使用BinarySearchBinarySearch超负荷不允许代表。如果您不得不将汽车作为参数进行查找,那么使用BinarySearch是什么?

+0

字典?... – 2011-02-07 09:37:06

回答

5

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

但是,我建议您使用更合适的集合类,而不是按键快速检索。例如,SortedList<,>SortedDictionary<,>都将在O(logn)中完成这项工作。如果订购不是真正的要求,那么Dictionary<,>可能会更容易。

+0

关于你答案的第一部分。我用IComparer ,但发现我不能在BinarySearch中使用委托。所以我不明白如何编写接口IComparer (我想这是你的意思是接口)的帮助。我将不得不对不同的字段组合进行查找,因此我认为在循环之前循环和查找之前要做不同的排序。 – Gerard 2011-02-07 10:24:25