67

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 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?)

Community
  • 1
  • 1
citronas
  • 19,035
  • 27
  • 96
  • 164

8 Answers8

102

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
  • 1,026,079
  • 266
  • 2,566
  • 2,900
  • Oh, yeah you are absolutly right. Seems that I have to get used to the Any() Method ;) thanks – citronas Dec 29 '09 at 22:39
  • 4
    The answer in http://stackoverflow.com/questions/1728303/how-can-i-split-and-trim-a-string-into-parts-all-on-one-line is more elegant maybe? – Rick Jan 09 '15 at 18:26
  • @Morty Yeah, maybe. But you'll find that business rules are far more important than implementation details. Besides, both solutions work, so it's just good we have options. – Ulysses Alves Oct 02 '19 at 12:33
  • The Array.ConvertAll() is not available in .NET Compact Framework. – Behzad Ebrahimi Mar 29 '20 at 11:27
17
var parts = line
    .Split(';')
    .Select(p => p.Trim())
    .Where(p => !string.IsNullOrWhiteSpace(p))
    .ToArray();
Darius Kucinskas
  • 10,193
  • 12
  • 57
  • 79
  • This also removes blank (IsNullOrWhiteSpace) entries, so that " abc, foo , , bar" (extra comma) gives 3 trimmed results rather than 4. This is what I needed, but didn't see this until I'd rolled my own :) – Zef Aug 24 '21 at 16:57
8

I know this is 10 years too late but you could have just split by ' ' as well:

string[] split= keyword.Split(new char[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries);

Because you're also splitting by the space char AND instructing the split to remove the empty entries, you'll have what you need.

Miklos Kanyo
  • 186
  • 1
  • 2
6

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
  • 4,950
  • 1
  • 31
  • 31
3

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
  • 5,702
  • 1
  • 35
  • 43
  • Regex, haven't thought of that either, but you are right, would be a another possible solution. thanks – citronas Dec 29 '09 at 22:42
  • 1
    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 Dec 29 '09 at 22:42
  • 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 Dec 30 '09 at 00:57
3

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
  • 57,174
  • 8
  • 131
  • 162
1

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
  • 13,714
  • 5
  • 37
  • 63
1

Starting with .Net 5, there is an easier option:

string[] split= keyword.Split(new char[] { ',', ';' }, StringSplitOptions.TrimEntries);

You can combine it with the option to remove empty entries:

string[] split= keyword.Split(new char[] { ',', ';' }, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
Andreas Schwarz
  • 1,788
  • 17
  • 42