Reputation: 196539
I want to:
I can do it with this below, but then it will blow up if there is an "Id" substring other than the end. Is there a RemoveFromEnd() method that takes a number of characters argument?
if (column.EndsWith("Id"))
{
//remove last 2 characters
column = column.replace("Id", "");
}
I see this solution, which does this:
column = System.Text.RegularExpressions.Regex.Replace(column, "Id$", "");
but it says it's pretty slow and I am going to be running this code inside a code block that I would like to be extremely fast so I wanted to see if a faster solution is available.
Upvotes: 61
Views: 59407
Reputation: 1384
With the (relatively) new Range Syntax introduced in C# 8 you can simplify the RemoveEnd
method even more:
public static string RemoveFromEnd(this string s, string suffix)
{
if (s.EndsWith(suffix))
{
return s[..^suffix.Length];
}
return s;
}
Upvotes: 2
Reputation: 437386
String.Substring
can do that:
column = column.Substring(0, column.Length - 2);
You can use it to roll your own RemoveFromEnd
:
public static string RemoveFromEnd(this string s, string suffix)
{
if (s.EndsWith(suffix))
{
return s.Substring(0, s.Length - suffix.Length);
}
return s;
}
Upvotes: 101
Reputation: 19938
An alternative to the SubString
method is to use a Regex.Replace
from System.Text.RegularExpressions
:
using System.Text.RegularExpressions;
...
column = Regex.Replace(column, @"Id$", String.Empty);
This way enables you to avoid the test, but not sure if it is really a speed benefit :-). At least an alternative that might be useful in some cases where you need to check for more than one thing at a time.
The regex can be compiled and re-used to get some performance increase and used instead of the call to the static method and can be used like this:
// stored as a private member
private static Regex _checkId = new Regex(@"Id$", RegexOptions.Compiled);
...
// inside some method
column = _checkId.Replace(column, String.Empty);
Upvotes: 17
Reputation: 5043
Well, there can be a RemoveFromEnd()
method if you write your own:
public static string RemoveFromEnd(this string str, string toRemove)
{
if (str.EndsWith(toRemove))
return str.Substring(0, str.Length - toRemove.Length);
else
return str;
}
You can just use it as follows:
column = column.RemoveFromEnd("Id");
Upvotes: 6
Reputation: 158309
Since you know the length of the part to remove, you can use Substring
:
if (column.EndsWith("Id"))
{
column = column.Substring(0, column.Length - 2);
}
Upvotes: 4
Reputation: 21141
Couple of notes to add to @Jon's answer:
Do you want to do this case insensitively?
if (column.ToLower().EndsWith("id")) { column = column.Remove(column.Length - 2); }
If ID is unique in the string and needs to always be removed...
#No if check....
column = column.Replace("Id", "");
If its case insensitive and only occurs once I would still use the first check.
Upvotes: 0
Reputation: 1413
Try this:
if (column.IndexOf("Id") == column.Length-2) {
column = column.Substring(0, column.Length-2);
}
Upvotes: 1