Comment supprimer le dernier caractère d'une chaîne en C #?


94

Construire une chaîne pour la demande de publication de la manière suivante,

  var itemsToAdd = sl.SelProds.ToList();
  if (sl.SelProds.Count() != 0)
  {
      foreach (var item in itemsToAdd)
      {
        paramstr = paramstr + string.Format("productID={0}&", item.prodID.ToString());
      }
  }

après que je me obtenu paramstr, je dois effacer le dernier caractère &en elle

Comment supprimer le dernier caractère d'une chaîne en utilisant C #?


2
Je suppose que c'est mieux de ne pas l'ajouter en premier lieu, mais sinon, vous pouvez essayer paramstr.Substring (0, paramstr.Length - 1)
Jaco Pretorius

Dans le cas où votre prodID est autorisé à contenir des caractères arbitraires, en particulier &, vous devez vous assurer qu'il est correctement échappé, comme par exemple la réponse de @MarcGravell.
Evgeniy Berezovsky

Réponses:


75

construisez-le avec à la string.Joinplace:

var parameters = sl.SelProds.Select(x=>"productID="+x.prodID).ToArray();
paramstr = string.Join("&", parameters);

string.Joinprend un séparateur ( "&") et un tableau de chaînes ( parameters), et insère le séparateur entre chaque élément du tableau.


1
Il convient de noter que cela est utile si vous ne souhaitez pas avoir de signe & à la fin de la chaîne.
Ammar

Je savais que c'était en Ruby, je n'avais aucune idée que c'était en C # et je suis un développeur .net. Je me sens tellement embarrassé lol
Jack Marchetti

Je ne peux pas croire que c'était la réponse choisie ... celle juste en dessous de @BrianRasmussen est tellement plus simple.
FastTrack

@FastTrack Il a résolu le problème racine, par opposition à la réponse à la question dans le titre. Ma plainte: si vous voulez parler couramment, pourquoi ne pas tout faire en une seule ligne.
Graham

241

Personnellement, j'irais avec la suggestion de Rob, mais si vous souhaitez supprimer un (ou plusieurs) caractère (s) de fin spécifique, vous pouvez utiliser TrimEnd. Par exemple

paramstr = paramstr.TrimEnd('&');

15
Sachez que TrimEnd supprimera toutes les occurrences de fin de ce caractère '&' ... donc si la chaîne se termine par '&&&', TrimEnd supprimera tous les 3 de ces '&', pas seulement le dernier. C'est peut-être ce que souhaite ou non le PO.
Doug S

3
@DougS FWIW J'ai écrit "en supprimer un (ou plusieurs)".
Brian Rasmussen

+1 pour une solution simple, qui peut donc être facilement utilisée comme composant pour d'autres problèmes. Je cherchais une solution pour créer un chemin à partir de plusieurs parties en veillant à ne pas avoir de doubles barres obliques ou manquantes. La combinaison de TrimEnd et TrimStart avec cette technique garantit cela.
Joeppie

1
@Joeppie: suggère d'utiliser Path.Combine, qui comprend tous les séparateurs de chemin. Utilisez le moins possible Trimqui commence et se termine en une seule fois.
Nigel Touch

@Nigel le problème que j'ai avec Path.Combine est que si le deuxième argument commence par une barre oblique, il est interprété comme un chemin absolu, et le résultat est le chemin absolu; c'est quelque chose que je préfère «sauver» les gens qui appellent mon code. Bon point sur le Trim, cependant :)
Joeppie

22
string source;
// source gets initialized
string dest;
if (source.Length > 0)
{
    dest = source.Substring(0, source.Length - 1);
}

15

Essaye ça:

paramstr.Remove((paramstr.Length-1),1);

2
Envisageriez-vous d'expliquer un peu votre réponse, afin que les autres personnes qui viennent avec vous aient une meilleure idée des raisons pour lesquelles vous l'avez suggérée?
Andrew Barber

1
La réponse de @Altaf Patel utilise la méthode sœur String.Remove Method (Int32) qui est sans doute plus simple dans cette situation. Cependant, il est bon de connaître la méthode String.Remove (Int32, Int32) qui offre la possibilité de couper une sous-chaîne de longueur arbitraire de n'importe où dans la chaîne source.
DavidRR

13

Je ne l'ajouterais tout simplement pas en premier lieu:

 var sb = new StringBuilder();

 bool first = true;
 foreach (var foo in items) {
    if (first)
        first = false;
    else
        sb.Append('&');

    // for example:
    var escapedValue = System.Web.HttpUtility.UrlEncode(foo);

    sb.Append(key).Append('=').Append(escapedValue);
 }

 var s = sb.ToString();

Je ne dirai rien sur la lisibilité de cet extrait de code, mais c'est ainsi que je le ferais.
Matti Virkkunen

2
Il est également bon marché et facile de simplement raccourcir la longueur du StringBuilder d'une fois la boucle terminée.
Matt Greer

+1 pour ne pas l'ajouter au lieu de le supprimer, pour utiliser un StringBuilder au lieu de + =, et pour chaîner les ajouts au lieu de concaténer et d'ajouter. :)
Guffa

1
Le problème avec cette solution est que l'opérateur "si" est appelé "n" fois.
magallanes

11
string str="This is test string.";
str=str.Remove(str.Length-1);

1
From String.Remove, méthode (Int32) : "Renvoie une nouvelle chaîne dans laquelle tous les caractères de l'instance actuelle, commençant à une position spécifiée et continuant jusqu'à la dernière position, ont été supprimés."
DavidRR

7

C'est mieux si vous utilisez string.Join.

 class Product
 {
   public int ProductID { get; set; }
 }
 static void Main(string[] args)
 {
   List<Product> products = new List<Product>()
      {   
         new Product { ProductID = 1 },
         new Product { ProductID = 2 },
         new Product { ProductID = 3 }
      };
   string theURL = string.Join("&", products.Select(p => string.Format("productID={0}", p.ProductID)));
   Console.WriteLine(theURL);
 }

Vous manquez .ToArray()dans votre Joindéclaration. +1 cependant. M'a aidé.
desaivv

1
@desaivv: Non, j'utilisais cette surcharge:, public static string Join<T>(string separator, IEnumerable<T> values)c'est nouveau en C # 4.0 :)
Cheng Chen

Ahh mon mal. Toujours en utilisant VS2008 avec 3.0
desaivv

5

Il est recommandé d'utiliser a StringBuilderlors de la concaténation de nombreuses chaînes et vous pouvez ensuite utiliser la méthode Remove pour vous débarrasser du caractère final.

StringBuilder paramBuilder = new StringBuilder();

foreach (var item in itemsToAdd)
{
    paramBuilder.AppendFormat(("productID={0}&", item.prodID.ToString());
}

if (paramBuilder.Length > 1)
    paramBuilder.Remove(paramBuilder.Length-1, 1);

string s = paramBuilder.ToString();

Je me suis également souvenu que vous pouviez également paramBuilder.Length - 1supprimer le dernier caractère.
Dan Diplo

1
paramstr.Remove((paramstr.Length-1),1);

Cela fonctionne pour supprimer un seul caractère à la fin d'une chaîne. Mais si je l'utilise pour supprimer, disons, 4 caractères, cela ne fonctionne pas:

paramstr.Remove((paramstr.Length-4),1);

Comme alternative, j'ai utilisé cette approche à la place:

DateFrom = DateFrom.Substring(0, DateFrom.Length-4);

2
Utilisation String.Remove Méthode (Int32, Int32) , pour supprimer 4 caractères à partir de la fin d'une chaîne: result = source.Remove((source.Length - 4), 4);.
DavidRR

0

Ajoutez un StringBuilder extension method.

public static StringBuilder RemoveLast(this StringBuilder sb, string value)
{
    if(sb.Length < 1) return sb;
    sb.Remove(sb.ToString().LastIndexOf(value), value.Length);
    return sb;
}

puis utilisez:

yourStringBuilder.RemoveLast(",");
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.