C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
It requires the location of the substring (a start index, a length). It then returns a new string with the characters in that range.
Strings are immutable. We will never change their opinions about things. Substring does not change their data. It copies fragments from them into new buffers.
First part. Here we extract the first part of a string into a new string. We can use the Substring method with two parameters—the first is 0 and the second is the desired length.
Argument 1: The starting index of the substring. Please remember strings are indexed with the first character 0.
Argument 2: The length of the substring part. This is not the final index, but the count of characters in the substring we want.
Based on: .NET 4.5 C# program that uses Substring using System; class Program { static void Main() { string input = "OneTwoThree"; // Get first three characters. string sub = input.Substring(0, 3); Console.WriteLine("Substring: {0}", sub); } } Output Substring: One
Methods. These are two Substring overloads. The first integer argument is always the start index. The second, optional argument is the desired length—not the end index.
Substring parameters Substring(0, 3) Returns substring of first 3 chars. Substring(3, 3) Returns substring of second 3 chars. Substring(6) Returns substring of all chars after first 6.
One parameter. This Substring overload receives just the start index int. The second parameter is considered the largest possible, meaning the substring ends at the last char.
Program: The program describes logic that takes all the characters in the input string excluding the first three.
Result: The end result is that you extract the last several characters. The length is reduced by three.
C# program that calls Substring, one argument using System; class Program { static void Main() { string input = "OneTwoThree"; // Indexes: // 0:'O' // 1:'n' // 2:'e' // 3:'T' // 4:'w' ... string sub = input.Substring(3); Console.WriteLine("Substring: {0}", sub); } } Output Substring: TwoThree
Middle chars. Here we take several characters in the middle of a string and place them into a new string. To take a middle substring, pass two arguments to Substring.
Note: We will want each argument to be a non-zero value to avoid the edge characters. Be careful to validate arguments.
Parameters: In this example, the two parameters say, "I want the substring at index 3 with a length of three."
C# program that uses Substring, two arguments using System; class Program { static void Main() { string input = "OneTwoThree"; string sub = input.Substring(3, 3); Console.WriteLine("Substring: {0}", sub); } } Output Substring: Two
Avoid chars. Here we eliminate the last few chars in a string. This example eliminates the last five characters from the input string. It returns a new string without them.
Info: This method reduces the length of a string. It will cause an error if the string is too short—a check would be needed.
Remove: The Remove method can be used to remove parts of strings too. It just internally forwards to Substring with the correct arguments.
C# program that uses Substring, ending characters using System; class Program { static void Main() { string input = "OneTwoThree"; string sub = input.Substring(0, input.Length - 5); Console.WriteLine("Substring: {0}", sub); } } Output Substring: OneTwo
Notation. Other languages use different arguments for substring. For example, in Java the start index and the end index are specified—the length of the substring is not needed.
Slice: In Python and JavaScript, slice notation is often used. We can use relative indexes.
An extension. We can add an extension method to "slice" strings. So you can specify indexes, as in Java or Python, to get substrings in your C# program.
Research. Here is some reference material on MSDN. I recommend using all resources possible to improve your knowledge. But MSDN is often confusing.
Retrieves a substring from this instance. The substring starts at a specified character position and has a specified length.
Exceptions are raised when Substring() is called with incorrect arguments. Exceptions can be scary, but they are trying to help you. This example triggers the ArgumentOutOfRangeException.
Tip: When you try to go beyond the string length, or use an argument < 0, you get an ArgumentOutOfRangeException.
C# program that shows exceptions using System; class Program { static void Main() { string input = "OneTwoThree"; try { string sub = input.Substring(-1); } catch (Exception ex) { Console.WriteLine(ex); } try { string sub = input.Substring(0, 100); } catch (Exception ex) { Console.WriteLine(ex); } } } Output System.ArgumentOutOfRangeException System.String.InternalSubStringWithChecks System.ArgumentOutOfRangeException System.String.InternalSubStringWithChecks
Performance is important. String-related allocations can be a burden. I wanted to see if taking characters and putting them into a char array is faster than calling Substring.
Result: Substring is faster. But if we want to extract only certain characters, consider the char array approach shown.
Tip: It is best to use Substring when it has equivalent behavior. Code is shorter, simpler and easier to read.
Data tested string s = "onetwothree"; // Input Char array method version char[] c = new char[3]; c[0] = s[3]; c[1] = s[4]; c[2] = s[5]; string x = new string(c); // "two" if (x == null) { } Substring version string x = s.Substring(3, 3); // "two" if (x == null) { } Substring benchmark result New char[] array: 2382 ms Substring: 2053 ms [faster]
One character. It is possible to take a one-character substring. But if we simply use the string indexer to get a character, we will have better performance.
Note: Substring creates an object on the heap. The string indexer just returns a char, which is an integer-like value—this is faster.
C# program that uses char, Substring using System; class Program { static void Main() { string value = "cat"; // ... In many programs, we can use a char instead of Substring. Console.WriteLine(value[0]); Console.WriteLine(value.Substring(0, 1)); } } Output c c
With logic, we can avoid invoking Substring. Suppose a program gets the same Substring over and over again. We can handle this case in code, and return a literal.
Here: I introduce simple code in SubstringFirst3 that optimizes the case of getting the first 3 letters of the string "Windows."
So: In a program that happens to do this operation many times, this logic would reduce allocations and increase speed.
C# that avoids Substring using System; class Program { static string SubstringFirst3(string value) { // ... Use logic to avoid creating a new string. if (value == "Windows") { return "Win"; } else { return value.Substring(0, 3); } } static void Main() { Console.WriteLine(SubstringFirst3("Windows")); Console.WriteLine(SubstringFirst3("Computer")); } } Output Win Com
Rewrite Split. Internally the Split method finds Substrings and places them into a string array. With Substring and IndexOf we can duplicate this logic.
Sometimes: We only need a single part of a large string. If we avoid Split in this case, we can avoid creating many strings.
Bugs: This style of optimization can yield code that is fast but prone to bugs. Be prepared to fix problems.
A brief history of Substring. This method allocates a new string. We invoke it with one or two arguments—the start and length. It does not receive an end index.
Finally, we learned about Slice, Substring exceptions, and Substring performance. As with all string methods, avoiding them when possible is often the best optimization.