2010-01-19 69 views
2

以下是存儲在我的數組列表中的數據的格式。ArrayList搜索.net

A-Amsterdam 
B- Brussels 
C-Canada 

如此等等。 我想通過只傳遞前幾個字符來搜索我的數組列表,直到' - ' 因此,如果我有類似AA-Test的東西,那麼我想通過'AA'來檢查它是否存在。

我知道我可以使用contains或binarysearch,但它不能滿足我的目的,因爲它們都比較對象。

任何建議? 感謝

回答

2

您可以通過創建自己的IComparer並將它傳遞到二分查找解決這個問題:

public class StartsWithComparer : IComparer 
{ 
    public int Compare(Object x, Object y) 
    { 
     String left = x as String; 
     String right = y as String; 

     if (ReferenceEquals(left, right)) 
     { 
      return 0; 
     } 

     if (ReferenceEquals(left, null)) 
     { 
      return -1; 
     } 

     if (ReferenceEquals(right, null)) 
     { 
      return 1; 
     } 

     return (x.StartsWith(y) || y.StartsWith(x)) ? 0 : x.CompareTo(y); 
    } 
} 

後來......

myArrayList.Sort() 
myArrayList.BinarySearch("AA", new StartsWithComparer()); 
0

你可能要考慮的大小arraylist以及您將要執行的查找次數:

如果您的數據集中有大量元素(大數組列表)或大數的搜索算法,您需要使用搜索算法,如二進制搜索

如果數據足夠大,您可以考慮將數據存儲在您希望通過前幾個字符索引的散列表中( 'AA'在你的例子中)。

最後,對於小的數組列表大小和大量的查找,您可能會發現使用相同的比較器函數和線性搜索實際上表現更好。這已在此進一步討論:At which n does binary search become faster than linear search on a modern CPU?