Как удалить суффикс из конца строки? - PullRequest
36 голосов
/ 12 марта 2011

Я хочу:

  1. Проверьте переменную и определите, являются ли последние 2 символа "Id"
  2. Если да, удалите их.

Я могу сделать это ниже, но они взорвутся, если есть подстрока Id, отличная от конца. Есть ли метод RemoveFromEnd (), который принимает аргумент из нескольких символов?

 if (column.EndsWith("Id"))
 {
       //remove last 2 characters
       column = column.replace("Id", "");
 }

Я вижу это решение : что делает это:

column = System.Text.RegularExpressions.Regex.Replace(column, "Id$", "");

но он говорит, что он довольно медленный, и я собираюсь запустить этот код в блоке кода, который я хотел бы быть очень быстрым, поэтому я хотел посмотреть, доступно ли более быстрое решение.

Ответы [ 6 ]

65 голосов
/ 12 марта 2011

String.Substring может сделать это:

column = column.Substring(0, column.Length - 2);

Вы можете использовать его, чтобы бросить свой собственный RemoveFromEnd:

public static string RemoveFromEnd(this string s, string suffix)
{
    if (s.EndsWith(suffix))
    {
        return s.Substring(0, s.Length - suffix.Length);
    }
    else
    {
        return s;
    }
}
10 голосов
/ 12 марта 2011

Альтернативой методу SubString является использование Regex.Replace из System.Text.RegularExpressions:

using System.Text.RegularExpressions;
...
column = Regex.Replace(column, @"Id$", String.Empty);

. Этот способ позволяет избежать теста, но не уверен, действительно ли это скоростьвыгода :-).По крайней мере, альтернатива, которая может быть полезна в некоторых случаях, когда вам нужно проверять более чем одну вещь одновременно.

Регулярное выражение может быть скомпилировано и использовано повторно, чтобы получить некоторое увеличение производительности и использоваться вместовызов статического метода и может использоваться следующим образом:

// stored as a private member
private static Regex _checkId = new Regex(@"Id$", RegexOptions.Compiled);
...
// inside some method
column = _checkId.Replace(column, String.Empty);
4 голосов
/ 12 марта 2011

Поскольку вы знаете длину удаляемой детали, вы можете использовать Substring:

if (column.EndsWith("Id"))
{    
    column = column.Substring(0, column.Length - 2);
}
3 голосов
/ 12 марта 2011

Ну, может быть метод RemoveFromEnd(), если вы напишите свой собственный:

public static string RemoveFromEnd(this string str, string toRemove)
{
    if (str.EndsWith(toRemove))
        return str.Substring(0, str.Length - toRemove.Length);
    else
        return str;
}

Вы можете просто использовать его следующим образом:

column = column.RemoveFromEnd("Id");
1 голос
/ 12 марта 2011

Попробуйте это:

if (column.IndexOf("Id") == column.Length-2) {
    column = column.Substring(0, column.Length-2);
}
0 голосов
/ 12 марта 2011

Пару заметок, чтобы добавить к ответу @ Jon:

Вы хотите сделать этот случай без учета регистра?

if (column.ToLower().EndsWith("id")) { column = column.Remove(column.Length - 2); }

Если идентификатор уникален в строке и его всегда нужно удалять...

 #No if check....
 column = column.Replace("Id", "");

Если его регистр не учитывается и встречается только один раз, я все равно использовал бы первую проверку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...