views:

684

answers:

3

What is the fastest way to compare a string with an array of strings in C#2.0

+4  A: 

If you are doing this many times with a single array, you should sort the array and binary search it:

Array.Sort(array);
int index = Array.BinarySearch(array, input);
// if (index < 0) 
//      does not exists, "items > ~index" are larger and "< ~index" are smaller
// otherwise, "items > index" are larger and "< index" are smaller.

Otherwise just check the whole array naively:

bool exists = Array.IndexOf(array, input) >= 0;
Mehrdad Afshari
If you're going to do it many times, there are more efficient searches than a binary search (assuming it's reasonably large, anyway). I'd go for something hash-based, e.g. HashSet.
Jon Skeet
Yep. The hash table/binary search tree debate... Both are better than searching the whole array, nevertheless. HashSet is only available in 3.5 though.
Mehrdad Afshari
Thanks very much for the answer guys/
Greens
+1  A: 

You mean to see if the string is in the array? I can't remember if arrays support the .Contains() method, so if not, create a List< string >, add your array to the list via AddRange(), then call list.Contains({string to compare}). Will return a boolean value indicating whether or not the string is in the array.

James McConnell
Correct, in 2.0 you would have to do `(new List<String>(array)).Contains(targetString);` - but from 3.5 you have the IEnumerable<String>.Contains extension method, so it's available for arrays also.
Groo
In 2.0, you can check whether the array contains a specific value or not with a simple `Array.IndexOf(arr, val) >= 0`.
Mehrdad Afshari
+9  A: 

What kind of comparison do you want? Do you want to know if the given string is in the array?

bool targetStringInArray = array.Contains(targetString);

do you want an array of comparison values (positive, negative, zero)?

var comparisons = array.Select(x => targetString.CompareTo(x));

If you're checking for containment (i.e. the first option) and you're going to do this with multiple strings, it would probably be better to build a HashSet<string> from the array:

var stringSet = new HashSet<string>(array);

if (stringSet.Contains(firstString))  ...
if (stringSet.Contains(secondString)) ...
if (stringSet.Contains(thirdString))  ...
if (stringSet.Contains(fourthString)) ...
Jon Skeet
This answer is infinitely better than mine.
James McConnell