130 votes

C# - Méthode la plus simple pour supprimer la première occurrence d'une sous-chaîne d'une autre chaîne de caractères

J'ai besoin de supprimer la première (et SEULEMENT la première) occurrence d'une chaîne de caractères d'une autre chaîne de caractères.

Voici un exemple de remplacement de la chaîne de caractères "\\Iteration" . Ceci :

ProjectName\\\\Iteration\\\\Release1\\\\Iteration1

deviendrait ceci :

ProjectName\\\\Release1\\\\Iteration1

Voici un code qui permet de réaliser cette opération :

const string removeString = "\\Iteration";
int index = sourceString.IndexOf(removeString);
int length = removeString.Length;
String startOfString = sourceString.Substring(0, index);
String endOfString = sourceString.Substring(index + length);
String cleanPath = startOfString + endOfString;

Cela semble être beaucoup de code.

Ma question est donc la suivante : Existe-t-il une façon plus propre, plus lisible et plus concise de procéder ?

8voto

Daniel Filipe Points 172

Si vous souhaitez une méthode simple pour résoudre ce problème. (Peut être utilisé comme extension)

Voir ci-dessous :

    public static string RemoveFirstInstanceOfString(this string value, string removeString)
    {
        int index = value.IndexOf(removeString, StringComparison.Ordinal);
        return index < 0 ? value : value.Remove(index, removeString.Length);
    }

Utilisation :

    string valueWithPipes = "| 1 | 2 | 3";
    string valueWithoutFirstpipe = valueWithPipes.RemoveFirstInstanceOfString("|");
    //Output, valueWithoutFirstpipe = " 1 | 2 | 3";

Inspiré et modifié par la réponse de @LukeH et @Mike.

N'oubliez pas StringComparison.Ordinal pour éviter les problèmes liés aux paramètres culturels. https://www.jetbrains.com/help/resharper/2018.2/StringIndexOfIsCultureSpecific.1.html

1voto

Greg Roberts Points 1824

Je suis tout à fait d'accord pour dire que c'est parfait pour une méthode d'extension, mais je pense qu'il est possible de l'améliorer un peu.

public static string Remove(this string source, string remove,  int firstN)
    {
        if(firstN <= 0 || string.IsNullOrEmpty(source) || string.IsNullOrEmpty(remove))
        {
            return source;
        }
        int index = source.IndexOf(remove);
        return index < 0 ? source : source.Remove(index, remove.Length).Remove(remove, --firstN);
    }

Il s'agit d'un peu de récursivité, ce qui est toujours amusant.

Voici également un test unitaire simple :

   [TestMethod()]
    public void RemoveTwiceTest()
    {
        string source = "look up look up look it up";
        string remove = "look";
        int firstN = 2;
        string expected = " up  up look it up";
        string actual;
        actual = source.Remove(remove, firstN);
        Assert.AreEqual(expected, actual);

    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X