web-dev-qa-db-fra.com

Comment supprimer un suffixe en fin de chaîne?

Je veux:

  1. Vérifier une variable et déterminer si les 2 derniers caractères sont "Id"
  2. Si oui, supprimez-les.

Je peux le faire avec cela ci-dessous, mais ils vont exploser s'il existe une sous-chaîne "Id" autre que la fin. Existe-t-il une méthode RemoveFromEnd () qui prend un argument en nombre de caractères?

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

Je vois cette solution : qui fait ceci:

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

mais cela dit que c'est assez lent et que je vais exécuter ce code dans un bloc de code que j'aimerais être extrêmement rapide, donc je voulais voir si une solution plus rapide est disponible.

33
leora

String.Substring peut faire cela:

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

Vous pouvez l'utiliser pour créer votre propre 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;
    }
}
57
Jon

Une alternative à la méthode SubString consiste à utiliser un Regex.Replace à partir de System.Text.RegularExpressions:

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

Cela vous permet d’éviter le test, mais vous ne savez pas si c’est vraiment un avantage de vitesse :-). Au moins une alternative qui pourrait être utile dans certains cas où vous devez vérifier plus d’une chose à la fois.

La regex peut être compilée et réutilisée pour obtenir une augmentation des performances et utilisée à la place de l'appel de la méthode statique. Elle peut être utilisée comme ceci:

// stored as a private member
private static Regex _checkId = new Regex(@"Id$", RegexOptions.Compiled);
...
// inside some method
column = _checkId.Replace(column, String.Empty);
9
jdehaan

Puisque vous connaissez la longueur de la pièce à supprimer, vous pouvez utiliser Substring :

if (column.EndsWith("Id"))
{    
    column = column.Substring(0, column.Length - 2);
}
4
Fredrik Mörk

Eh bien, il peut y avoir une méthode RemoveFromEnd() si vous écrivez la vôtre:

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

Vous pouvez simplement l'utiliser comme suit:

column = column.RemoveFromEnd("Id");
3
FarligOpptreden

Essaye ça:

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

Quelques notes à ajouter à la réponse de @ Jon:

Voulez-vous faire ce cas de manière insensible?

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

Si l'ID est unique dans la chaîne et doit toujours être supprimé ...

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

Si c'est insensible à la casse et ne se produit qu'une fois, j'utiliserais encore le premier contrôle.

0
GrayWizardx