views:

116

answers:

3

I have an unsorted list of strings. I can place these items in an array, List, SortedList, whatever.

I need to find the fastest way of looking up a string in this list. Am I better off dumping the list into an array, sorting it, then implementing binary search? Or does the framework provide a way to do this?

Thanks

P.S. Using VS2008 against .NET 2.0

+6  A: 

If your goal is just to make it very fast to find the strings in a collection, put them into a HashSet.

HashSet.Contains is an O(1) method, and strings have a good hash algorithm by default, so it will be difficult to make a faster routine than this.


Edit:

Since you're using .NET 2, I would just do Dictionary<string,string> and use the same string for key and value. Dictinoary<TKey,TValue>.Contains is also O(1), and will be much faster than any list-based searching you attempt.

Reed Copsey
I apologise - I updated the tags. I am using VS2008 with .NET 2.0 - HashSets are not available.
AngryHacker
So use a `Hashtable`
Rubens Farias
Does .Net really have no equivalent to HashSet?
Dave
.NET has a HashSet, now. It did not in 2.0.
Reed Copsey
+1 Fascinating. When I read the question, I interpreted "look up" to mean something more than determining whether or not a given string "existed" in the collection :) No longer using .NET 2.0, but would never have thought of using a Dictionary in the way you suggest. thanks,
BillW
+2  A: 

If you will only have to find one object, one time, just start at the beginning and look at each one until you find it. If you will have to repeat this Find operation multiple times against the same list, to find different items, then sort it keep the sorted list and do a binary search...

Charles Bretana
+1  A: 

I'm not sure whether this will be of any use to you, but this would be a fairly simple way of doing it, not sure on the exact "speed" of it though.

List<string> collection = new List<string>();

collection.Sort();

foreach(string value in collection)
{
   if(value == "stringToLookFor")
   {
       return value;
   }
{
Jamie Keeling
If you are gonna loop through it anyway, why sort it?
AngryHacker
This is probably the slowest way to search the list. If you sorted it, you could do a BinarySearch which would be much faster but still slower than a search in a key/value based collection.
Jace Rhea
I just assumed sorting it would be faster to search through than looking through randomly place strings, especially if its at the beginning of the list. It was only a suggestion and by no means the only solution.
Jamie Keeling