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 #?

rem
la source
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.

Rob Fonseca-Ensor
la source
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('&');
Brian Rasmussen
la source
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);
}
Steve Townsend
la source
15

Essaye ça:

paramstr.Remove((paramstr.Length-1),1);
Nelson T Joseph
la source
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();
Marc Gravell
la source
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);
Altaf Patel
la source
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);
 }
Cheng Chen
la source
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();
Dan Diplo
la source
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);
Uzair Zaman Sheikh
la source
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(",");
nznoor
la source