2011-02-07 80 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