Best way to split string by last occurrence of character?

Let's say I need to split string like this:

Input string: "My. name. is Bond._James Bond!" Output 2 strings:

  1. "My. name. is Bond"
  2. "_James Bond!"

I tried this:

int lastDotIndex = inputString.LastIndexOf(".", System.StringComparison.Ordinal);
string firstPart = inputString.Remove(lastDotIndex);
string secondPart= inputString.Substring(lastDotIndex + 1, inputString.Length - firstPart.Length - 1);

Can someone propose more elegant way?


Solution 1:

Updated Answer (for C# 8 and above)

C# 8 introduced a new feature called ranges and indices, which offer a more concise syntax for working with strings.

string s = "My. name. is Bond._James Bond!";
int idx = s.LastIndexOf('.');

if (idx != -1)
{
    Console.WriteLine(s[..idx]); // "My. name. is Bond"
    Console.WriteLine(s[(idx + 1)..]); // "_James Bond!"
}

Original Answer (for C# 7 and below)

This is the original answer that uses the string.Substring(int, int) method. It's still OK to use this method if you prefer.

string s = "My. name. is Bond._James Bond!";
int idx = s.LastIndexOf('.');

if (idx != -1)
{
    Console.WriteLine(s.Substring(0, idx)); // "My. name. is Bond"
    Console.WriteLine(s.Substring(idx + 1)); // "_James Bond!"
}

Solution 2:

You can also use a little bit of LINQ. The first part is a little verbose, but the last part is pretty concise :

string input = "My. name. is Bond._James Bond!";

string[] split = input.Split('.');
string firstPart = string.Join(".", split.Take(split.Length - 1)); //My. name. is Bond
string lastPart = split.Last(); //_James Bond!