83 votes

C# TrimStart avec paramètre de chaîne

Je recherche des méthodes d'extension de chaîne pour TrimStart() et TrimEnd() qui acceptent un paramètre de chaîne.

Je pourrais en construire un moi-même, mais je suis toujours intéressé à voir comment les autres font les choses.

Comment cela peut-il être fait ?

114voto

Patrick McDonald Points 20645

Pour découper toutes les occurrences de la chaîne (exactement correspondante), vous pouvez utiliser quelque chose comme ceci :

TrimStart

public static string TrimStart(this string target, string trimString)
{
    if (string.IsNullOrEmpty(trimString)) return target;

    string result = target;
    while (result.StartsWith(trimString))
    {
        result = result.Substring(trimString.Length);
    }

    return result;
}

TrimEnd

public static string TrimEnd(this string target, string trimString)
{
    if (string.IsNullOrEmpty(trimString)) return target;

    string result = target;
    while (result.EndsWith(trimString))
    {
        result = result.Substring(0, result.Length - trimString.Length);
    }

    return result;
}

Pour découper n'importe lequel des caractères dans trimChars à partir du début/de la fin de la cible (par exemple, "foobar'@"@';".TrimEnd(";@'") "foobar"), vous pouvez utiliser ce qui suit :

TrimStart

public static string TrimStart(this string target, string trimChars)
{
    return target.TrimStart(trimChars.ToCharArray());
}

TrimEnd

public static string TrimEnd(this string target, string trimChars)
{
    return target.TrimEnd(trimChars.ToCharArray());
}

17voto

Rune Grimstad Points 17775

TrimStart et TrimEnd prennent en charge un tableau de caractères. Cela signifie que vous pouvez passer dans une chaîne comme un tableau de caractères comme ceci :

var trimChars = " .+-";
var trimmed = myString.TrimStart(trimChars.ToCharArray());

Donc je ne vois pas la nécessité d'une surcharge qui prend un paramètre de chaîne.

12voto

Tim Points 785

Je pensais que la question était d'essayer de couper une corde spécifique dès le début d'une corde plus grande.

Par exemple, si j'avais la chaîne "hellohellogoodbyehello", si vous essayiez d'appelerTrimStart ("hello") vous récupéreriez "goodbyehello".

Si c'est le cas, vous pouvez utiliser le code suivant :

string TrimStart(string source, string toTrim)
{
    string s = source;
    while (s.StartsWith(toTrim))
    {
        s = s.Substring(toTrim.Length - 1);
    }
    return s;
}

Ce ne serait pas super efficace si vous aviez besoin de faire beaucoup de coupe de corde, mais si c'est juste pour quelques cas, c'est simple et fait le travail.

4voto

Fabricio Godoy Points 136

Pour faire correspondre la chaîne entière et ne pas attribuer plusieurs sous-chaînes, vous devez utiliser ce qui suit :

    public static string TrimStart(this string source, string value, StringComparison comparisonType)
    {
        if (source == null)
        {
            throw new ArgumentNullException(nameof(source));
        }

        int valueLength = value.Length;
        int startIndex = 0;
        while (source.IndexOf(value, startIndex, comparisonType) == startIndex)
        {
            startIndex += valueLength;
        }

        return source.Substring(startIndex);
    }

    public static string TrimEnd(this string source, string value, StringComparison comparisonType)
    {
        if (source == null)
        {
            throw new ArgumentNullException(nameof(source));
        }

        int sourceLength = source.Length;
        int valueLength = value.Length;
        int count = sourceLength;
        while (source.LastIndexOf(value, count, comparisonType) == count - valueLength)
        {
            count -= valueLength;
        }

        return source.Substring(0, count);
    }

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