Come eliminare l'ultimo carattere in una stringa in C #?


94

Costruire una stringa per la richiesta di post nel modo seguente,

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

dopo aver ottenuto il risultato paramstr, devo eliminare l'ultimo carattere &al suo interno

Come eliminare l'ultimo carattere in una stringa usando C #?


2
Immagino sia meglio non aggiungerlo in primo luogo, ma altrimenti puoi provare paramstr.Substring (0, paramstr.Length - 1)
Jaco Pretorius

Nel caso in cui il tuo prodID possa contenere caratteri arbitrari, in particolare &, devi assicurarti che venga correttamente evitato, come ad esempio la risposta di @MarcGravell fa.
Evgeniy Berezovsky

Risposte:


75

costruiscilo string.Joininvece con :

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

string.Joinaccetta un separatore ( "&") e un array di stringhe ( parameters) e inserisce il separatore tra ogni elemento dell'array.


1
Vale la pena notare che questo è utile se non vuoi avere un segno & alla fine della stringa.
Ammar

Sapevo che era in Ruby, non avevo idea che fosse in C # e sono uno sviluppatore .net. Mi sento così imbarazzato lol
Jack Marchetti

Non posso credere che questa sia stata la risposta scelta ... quella appena sotto questa di @BrianRasmussen è molto più semplice.
FastTrack

@ FastTrack ha risolto il problema alla radice, invece di rispondere alla domanda nel titolo. La mia lamentela: se stai per essere fluente, perché non fai tutto in una riga.
Graham

241

Personalmente seguirò il suggerimento di Rob, ma se vuoi rimuovere uno (o più) caratteri finali specifici puoi usare TrimEnd. Per esempio

paramstr = paramstr.TrimEnd('&');

15
Tieni presente che TrimEnd rimuoverà tutte le occorrenze finali di quel carattere "&" ... quindi se la stringa termina con "&&&", TrimEnd rimuoverà tutte e 3 quelle "&", non solo l'ultima. Questo può o non può essere ciò che vuole l'OP.
Doug S

3
@DougS FWIW Ho fatto scrittore "rimuovere uno (o più)".
Brian Rasmussen

+1 per una soluzione semplice, che può quindi essere facilmente utilizzata come componente per altri problemi. Stavo cercando una soluzione per creare un percorso da più parti assicurandomi di non avere barre doppie o mancanti. La combinazione di TrimEnd e TrimStart con questa tecnica garantisce ciò.
Joeppie

1
@ Joeppie: suggerisci di usare Path.Combine, che comprende tutti i separatori di percorso. Usa almeno Trimche inizia e finisce in una volta.
Nigel Touch

@ Nigel il problema che ho con Path.Combine è che se il secondo argomento inizia con una barra, viene interpretato come un percorso assoluto e il risultato è il percorso assoluto; questo è qualcosa che preferisco "salvare" le persone che chiamano il mio codice. Buon punto sul Trim, però :)
Joeppie il

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

15

Prova questo:

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

2
Prenderesti in considerazione di spiegare un po 'la tua risposta, in modo che gli altri che si presentino abbiano un'idea migliore del motivo per cui l'hai suggerita?
Andrew Barber

1
La risposta di @Altaf Patel utilizza il metodo di pari livello String.Remove Method (Int32) che è probabilmente più semplice in questa situazione. Tuttavia, è utile conoscere il metodo String.Remove (Int32, Int32) che offre la possibilità di tagliare una sottostringa di lunghezza arbitraria da qualsiasi punto all'interno della stringa di origine.
DavidRR

13

Semplicemente non lo aggiungerei in primo luogo:

 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();

Non dirò nulla sulla leggibilità di questo snippet, ma è così che lo farei.
Matti Virkkunen

2
È anche economico e facile accorciare di uno la lunghezza di StringBuilder dopo che il ciclo è terminato.
Matt Greer

+1 per non averlo aggiunto invece di rimuoverlo, per aver usato StringBuilder invece di + = e per concatenare accodamenti invece di concatenarli e accodarli. :)
Guffa

1
Il problema con questa soluzione è che l'operatore "if" è chiamato "n" volte.
magallanes

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

1
Dal metodo String.Remove (Int32) : "Restituisce una nuova stringa in cui sono stati eliminati tutti i caratteri nell'istanza corrente, che iniziano in una posizione specificata e continuano fino all'ultima posizione."
DavidRR

7

È meglio se usi 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);
 }

Manca .ToArray()nella tua Joindichiarazione. +1 però. Mi ha aiutato.
desaivv

1
@desaivv: No, stavo usando questo sovraccarico:, public static string Join<T>(string separator, IEnumerable<T> values)è nuovo in C # 4.0 :)
Cheng Chen

Ahh, colpa mia. Ancora usando VS2008 con 3.0
desaivv

5

È buona norma utilizzare a StringBuilderquando si concatenano molte stringhe e quindi è possibile utilizzare il metodo Rimuovi per eliminare il carattere finale.

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();

Ho anche ricordato che puoi usare anche paramBuilder.Length - 1per rimuovere l'ultimo carattere.
Dan Diplo

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

Questo funziona per rimuovere un singolo carattere dalla fine di una stringa. Ma se lo uso per rimuovere, diciamo, 4 caratteri, questo non funziona:

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

In alternativa, ho utilizzato invece questo approccio:

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

2
Utilizzando String.Remove Method (Int32, Int32) , per rimuovere 4 caratteri dalla fine di una stringa: result = source.Remove((source.Length - 4), 4);.
DavidRR

0

Aggiungi un file 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;
}

quindi usa:

yourStringBuilder.RemoveLast(",");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.