tags:

views:

189

answers:

5

Hello folks, today I was wondering if there is a better solution perform the following code sample.

string keyword = " abc, foo  ,     bar";
string match = "foo";
string[] split= keyword.Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
foreach(string s in split)
{
  if(s.Trim() == match){// asjdklasd; break;}
}

Is there a way to perform trim() without manually iterating through each item? I'm looking for something like 'split by the following chars and automatically trim each result'.

Ah, immediatly before posting I found

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

in http://stackoverflow.com/questions/1728303/how-can-i-split-and-trim-a-string-into-parts-all-on-one-line

Still I'm curious: Might there be a better solution to this? (Or would the compiler probably convert them to the same code output as the Linq-Operation?)

+5  A: 

Another possible option (that avoids LINQ, for better or worse):

string line = " abc, foo  ,     bar";
string[] parts= Array.ConvertAll(line.Split(','), p => p.Trim());

However, if you just need to know if it is there - perhaps short-circuit?

bool contains = line.Split(',').Any(p => p.Trim() == match);
Marc Gravell
Oh, yeah you are absolutly right. Seems that I have to get used to the Any() Method ;)thanks
citronas
+3  A: 

I would suggest using regular expressions on the original string, looking for the pattern "any number of spaces followed by one of your delimiters followed by one or more spaces" and remove those spaces. Then split.

MikeW
Regex, haven't thought of that either, but you are right, would be a another possible solution. thanks
citronas
I would be very much against using regular expressions for such a trivial problem. See http://www.codinghorror.com/blog/archives/001016.html regarding "now you have two problems."
Eilon
Well I'm hopeless at writing regular expressions, and would screw it up, so I wouldn't use it either TBH, but this seems a fairly simply pattern to search and replace and I would have thought would be faster than any method that does a .Trim() on each element after splitting.
MikeW
A: 

You're going to find a lot of different methods of doing this and the performance change and accuracy isn't going to be readily apparent. I'd recommend plugging them all into a testing suite like NUnit in order both to find which one comes out on top AND which ones are accurate.

Use small, medium, and large amounts of text in loops to examine the various situations.

McAden
+1  A: 

Try this:

string keyword = " abc, foo  ,     bar";
string match = "foo";
string[] split = Regex.Split(keyword.Trim(), @"\s*[,;]\s*");
if (split.Contains(match))
{
    // do stuff
}
Rubens Farias
+1  A: 

If spaces just surrounds the words in the comma separated string this will work:

var keyword = " abc, foo  ,     bar";
var array = keyword.Replace(" ", "").Split(',');
if (array.Contains("foo"))
{
    Debug.Print("Match");
}
Jens Granlund
omg, haven't thought of that either. today was not my day =)
citronas