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?

TrimStart:

 public static ssortingng TrimStart(this ssortingng target, ssortingng sortingmChars) { return target.TrimStart(sortingmChars.ToCharArray()); } 

TrimEnd:

 public static ssortingng TrimEnd(this ssortingng target, ssortingng sortingmChars) { return target.TrimEnd(sortingmChars.ToCharArray()); } 

Notez que cette fonction rognera n’importe quel caractère de sortingmChars depuis le début / la fin de la cible, par exemple "foobar'@"@';".TrimEnd(";@'") renverra "foobar"

Si, au contraire, l’intention est de découper toutes les occurrences de la chaîne (qui correspond exactement), vous devriez utiliser quelque chose comme ceci:

TrimStart:

 public static ssortingng TrimStart(this ssortingng target, ssortingng sortingmSsortingng) { if (sortingmSsortingng.IsNullOrEmpty()) return target; ssortingng result = target; while (result.StartsWith(sortingmSsortingng)) { result = result.Subssortingng(sortingmSsortingng.Length); } return result; } 

TrimEnd:

 public static ssortingng TrimEnd(this ssortingng target, ssortingng sortingmSsortingng) { if (sortingmSsortingng.IsNullOrEmpty()) return target; ssortingng result = target; while (result.EndsWith(sortingmSsortingng)) { result = result.Subssortingng(0, result.Length - sortingmSsortingng.Length); } return result; } 

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

 var sortingmChars = " .+-"; var sortingmmed = mySsortingng.TrimStart(sortingmChars.ToCharArray()); 

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

Je pensais que la question essayait de couper une chaîne spécifique du début d’une chaîne plus grande.

Par exemple, si j’avais la chaîne “hellohellogoodbyehello”, si vous tentiez d’appeler TrimStart (“hello”), vous obtiendriez “goodbyehello”.

Si tel est le cas, vous pouvez utiliser le code suivant:

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

Ce ne serait pas très efficace si vous deviez couper beaucoup de cordes, mais si ce n’est que pour quelques cas, c’est simple et le travail est fait.

de dotnetperls.com ,

Performance

Malheureusement, la méthode TrimStart n’est pas fortement optimisée. Dans des situations spécifiques, vous serez probablement en mesure d’écrire un code d’itération basé sur des caractères qui peut le surpasser. En effet, un tableau doit être créé pour utiliser TrimStart.

Cependant: le code personnalisé ne nécessiterait pas nécessairement un tableau. Mais pour les applications développées rapidement, la méthode TrimStart est utile.

Pour faire correspondre la chaîne entière et ne pas allouer plusieurs sous-chaînes, vous devez utiliser les éléments suivants:

  public static ssortingng TrimStart(this ssortingng source, ssortingng value, SsortingngComparison 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.Subssortingng(startIndex); } public static ssortingng TrimEnd(this ssortingng source, ssortingng value, SsortingngComparison 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.Subssortingng(0, count); } 

Il n’y a pas de fonction intégrée dans C # – mais vous pouvez écrire vos propres extensions qui se comportent exactement comme vous le souhaitez.

Notez qu’avec IndexOf / LastIndexOf , vous pouvez choisir s’il est sensible à la casse / sensible à la culture ou non.

J’ai également implémenté la fonctionnalité “sortingms répétitifs”.

Il existe une fonction TrimStr(..) traitant des deux sortingms, plus trois fonctions implémentant .TrimStart(...) , .TrimEnd(...) et .Trim(..) pour la compatibilité avec les .Trim(..) .NET:

Essayez-le dans DotNetFiddle

 public static class Extension { public static ssortingng TrimStr(this ssortingng str, ssortingng sortingmStr, bool sortingmEnd = true, bool repeatTrim = true, SsortingngComparison comparisonType = SsortingngComparison.OrdinalIgnoreCase) { int strLen; do { if (!(str ?? "").EndsWith(sortingmStr)) return str; strLen = str.Length; { if (sortingmEnd) { var pos = str.LastIndexOf(sortingmStr, comparisonType); if ((!(pos >= 0)) || (!(str.Length - sortingmStr.Length == pos))) break; str = str.Subssortingng(0, pos); } else { var pos = str.IndexOf(sortingmStr, comparisonType); if (!(pos == 0)) break; str = str.Subssortingng(sortingmStr.Length, str.Length - sortingmStr.Length); } } } while (repeatTrim && strLen > str.Length); return str; } // the following is C#6 syntax, if you're not using C#6 yet // replace "=> ..." by { return ... } public static ssortingng TrimEnd(this ssortingng str, ssortingng sortingmStr, bool repeatTrim = true, SsortingngComparison comparisonType = SsortingngComparison.OrdinalIgnoreCase) => TrimStr(str, sortingmStr, true, repeatTrim, comparisonType); public static ssortingng TrimStart(this ssortingng str, ssortingng sortingmStr, bool repeatTrim = true, SsortingngComparison comparisonType = SsortingngComparison.OrdinalIgnoreCase) => TrimStr(str, sortingmStr, false, repeatTrim, comparisonType); public static ssortingng Trim(this ssortingng str, ssortingng sortingmStr, bool repeatTrim = true, SsortingngComparison comparisonType = SsortingngComparison.OrdinalIgnoreCase) => str.TrimStart(sortingmStr, repeatTrim, comparisonType) .TrimEnd(sortingmStr, repeatTrim, comparisonType); } 

Maintenant, vous pouvez simplement l’utiliser comme

  Console.WriteLine("Sammy".TrimEnd("my")); Console.WriteLine("moinmoin gibts gips? gips gibts moin".TrimStart("moin", false)); Console.WriteLine("moinmoin gibts gips? gips gibts moin".Trim("moin").Trim()); 

qui crée la sortie

Sam
moin gibts gips? gips gibts moin
gibts gips? gips

Je suppose que vous voulez dire que, par exemple, étant donné la chaîne “HelloWorld” et appeler la fonction pour “couper” le début avec “Bonjour”, vous seriez laissé avec “World”. Je soutiens que c’est vraiment une opération de sous-chaîne car vous supprimez une partie de la chaîne de longueur connue, plutôt qu’une opération de suppression qui supprime une longueur de chaîne inconnue.

En tant que tel, nous avons créé deux méthodes d’extension nommées SubssortingngAfter et SubssortingngBefore . Ce serait bien de les avoir dans le cadre, mais ils ne sont pas nécessaires pour les implémenter vous-mêmes. N’oubliez pas d’avoir un paramètre SsortingngComparison , et d’utiliser Ordinal par défaut si vous le rendez facultatif.

Si vous en voulez un qui n’utilise pas les fonctions de découpage intégrées pour quelque raison que ce soit, en supposant que vous souhaitiez utiliser une chaîne de saisie pour couper comme “~!” être essentiellement le même que le TrimStart intégré avec [”, ‘~’, ‘!’]

 public static Ssortingng TrimStart(this ssortingng inp, ssortingng chars) { while(chars.Contains(inp[0])) { inp = inp.Subssortingng(1); } return inp; } public static Ssortingng TrimEnd(this ssortingng inp, ssortingng chars) { while (chars.Contains(inp[inp.Length-1])) { inp = inp.Subssortingng(0, inp.Length-1); } return inp; } 

Fonction pour découper le début / la fin d’une chaîne avec un paramètre de chaîne, mais une seule fois (pas de boucle, cette seule case est plus populaire, la boucle peut être ajoutée avec un paramètre supplémentaire pour la déclencher):

 public static class BasicSsortingngExtensions { public static ssortingng TrimStartSsortingng(this ssortingng str, ssortingng sortingmValue) { if (str.StartsWith(sortingmValue)) return str.TrimStart(sortingmValue.ToCharArray()); //otherwise don't modify return str; } public static ssortingng TrimEndSsortingng(this ssortingng str, ssortingng sortingmValue) { if (str.EndsWith(sortingmValue)) return str.TrimEnd(sortingmValue.ToCharArray()); //otherwise don't modify return str; } } 

Comme mentionné précédemment, si vous souhaitez implémenter l’approche “while loop”, assurez-vous de vérifier la chaîne vide sinon elle peut restr en boucle pour toujours.