Fun With Extension Methods - Extending String to Provide a Better Split Method

Do you feel that the standard Split implementation of the String class is a bit awkward to use? Do you keep forgetting you have to declare a char array for the separator? And do you often need to split on multiple characters, like \r\n to split on a line break? In that case, read on. A simple extension method might fix that for you.

Creating a Better Split Method

With the Split method on the String class, splitting a string in multiple lines separated by a \r would look like this:

char [] splitChar = { '\r' };
string source = "Text of First Line\rText of Second Line";
string[] result = source.Split(splitChar);

You define a char array that holds the line break character (\r) and then call Split. Not very intuitive. Also, with this implementation, it's impossible to split on multiple characters, like \r\n - the line break often used on Windows systems.

Normally, you would fix this by calling the Split method of the Regex class in the System.Text.RegularExpressions namespace. However, I often find that people don't know about this class or namespace or find them hard to discover.

With a simple extension method, you can combine the best of both worlds: extend the String class with a Split method that accepts one or more characters in a string. The method itself could easily delegate to the Regex class. To implement this, all you need is some code like this:

namespace MyExtensionMethods
{
  public static class StringExtensions
  {
    /// <summary>
    /// Returns a string array that contains the substrings in this  
    /// string that are delimited by the specified string.		
    /// </summary>
    /// <param name="input">The input string to split.</param>
    /// <param name="separator">The string to split on like \r\n.</param>
    public static string[] Split(this string input, string separator)
    {
      return System.Text.RegularExpressions.Regex.Split(input, separator);
    }
  }
}

With this code, all you need to do is add a using or Imports statement to your code for the MyExtensionMethods namespace, and then you can use Split like this:

string splitChars = "\r\n";
string source = "Text of First Line\r\nText of Second Line";
string[] result = source.Split(splitChars);

This gives you access to the Split method right where you'd expect it: directly on the String class.


Where to Next?

Wonder where to go next? You can read existing comments below or you can post a comment yourself on this article .


Consider making a donation
Please consider making a donation using PayPal. Your donation helps me to pay the bills so I can keep running Imar.Spaanjaars.Com, providing fresh content as often as possible.



Feedback by Other Visitors of Imar.Spaanjaars.Com

On Monday, March 03, 2008 5:12:45 AM Muhammad said:
Hi,

Can you tell me when I reference the Split Method to source object how will the Split method which you define in StringExtensions class will call?
On Monday, March 03, 2008 8:07:44 AM Imar Spaanjaars said:
Hi Muhammad,

I don't understand what you are asking. If you are new to extension methods and want to know how they work, check out this post:
http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx

Cheers,

Imar
On Wednesday, May 14, 2008 10:20:12 PM Vladimir Kelman said:
A good one too.

Talk Back! Comment on Imar.Spaanjaars.Com

I am interested in what you have to say about this article. Feel free to post any comments, remarks or questions you may have about this article. The Talk Back feature is not meant for technical questions that are not directly related to this article. So, a post like "Hey, can you tell me how I can upload files to a MySQL database in PHP?" is likely to be removed. Also spam and unrealistic job offers will be deleted immediately.

When you post a comment, you have to provide your name and the comment. Your e-mail address is optional and you only need to provide it if you want me to contact you. It will not be displayed along with your comment. I got sick and tired of the comment spam I was receiving, so I have protected this page with a simple calculation exercise. This means that if you want to leave a comment, you'll need to complete the calculation before you hit the Post Comment button.

If you want to object to a comment made by another visitor, be sure to contact me and I'll look into it ASAP. Don't forget to mention the page link, or the QuickDocId of the document.

For more information about the Talk Back feature, check out this news item.