2010-01-19 120 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?