leora
leora

Reputation: 196539

How to remove a suffix from end of string?

I want to:

  1. Check a variable and determine if the last 2 characters are "Id"
  2. If yes, remove them.

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

Answers (7)

Jeanot Zubler
Jeanot Zubler

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

Jon
Jon

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

jdehaan
jdehaan

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

FarligOpptreden
FarligOpptreden

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

Fredrik Mörk
Fredrik Mörk

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

GrayWizardx
GrayWizardx

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

ngduc
ngduc

Reputation: 1413

Try this:

if (column.IndexOf("Id") == column.Length-2) {
    column = column.Substring(0, column.Length-2);
}

Upvotes: 1

Related Questions