Jak usunąć ostatni znak w ciągu w C #?


94

Budowanie ciągu znaków dla żądania posta w następujący sposób,

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

po uzyskaniu wyniku paramstrmuszę usunąć ostatni znak &w nim

Jak usunąć ostatni znak w ciągu przy użyciu C #?


2
Chyba lepiej po prostu nie dodawać tego w pierwszej kolejności, ale w przeciwnym razie możesz spróbować paramstr. Substring (0, paramstr.Length - 1)
Jaco Pretorius

W przypadku, gdy twój prodID może zawierać dowolne znaki, w szczególności &musisz upewnić się, że zostanie on odpowiednio zmieniony, tak jak robi to np. Odpowiedź @MarcGravell.
Evgeniy Berezovsky

Odpowiedzi:


75

string.Joinzamiast tego zbuduj :

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

string.Joinpobiera seperator ( "&") oraz tablicę ciągów ( parameters) i wstawia separator między każdy element tablicy.


1
Warto zauważyć, że jest to pomocne, jeśli nie chcesz mieć znaku & na końcu ciągu.
Ammar

Wiedziałem, że to jest w Rubim, nie miałem pojęcia, że ​​jest w C # i jestem programistą .net. Czuję się taki zawstydzony lol
Jack Marchetti

Nie mogę uwierzyć, że to była wybrana odpowiedź ... ta tuż pod tą autorstwa @BrianRasmussen jest o wiele prostsza.
FastTrack,

@FastTrack To rozwiązało problem główny, w przeciwieństwie do odpowiedzi na pytanie w tytule. Moja skarga: jeśli chcesz mówić płynnie, zrób to wszystko w jednej linijce.
Graham

241

Osobiście postąpiłbym zgodnie z sugestią Roba, ale jeśli chcesz usunąć jedną (lub więcej) określonych znaków końcowych, których możesz użyć TrimEnd. Na przykład

paramstr = paramstr.TrimEnd('&');

15
Należy pamiętać, że TrimEnd usunie wszystkie końcowe wystąpienia tego znaku „&” ... więc jeśli ciąg kończy się na „&&&”, wówczas TrimEnd usunie wszystkie trzy znaki „&”, a nie tylko ostatnie. To może, ale nie musi, być tym, czego chce PO.
Doug S

3
@DougS FWIW Zrobiłem, że pisarz „usunął jeden (lub więcej)”.
Brian Rasmussen

+1 za proste rozwiązanie, które można w ten sposób łatwo wykorzystać jako element składowy innych problemów. Szukałem rozwiązania umożliwiającego utworzenie ścieżki z wielu części, upewniając się, że nie mam podwójnych lub brakujących ukośników. Zapewnia to połączenie TrimEnd i TrimStart z tą techniką.
Joeppie

1
@Joeppie: zasugeruj użycie Path.Combine, które rozumie wszystkie separatory ścieżek. Najrzadziej używaj, Trimco zaczyna się i kończy za jednym razem.
Nigel Touch

@Nigel problem, który mam z Path.Combine polega na tym, że jeśli drugi argument zaczyna się od ukośnika, jest interpretowany jako ścieżka bezwzględna, a wynikiem jest ścieżka bezwzględna; to jest coś, z czego wolę „ratować” ludzi, którzy dzwonią na mój kod. Dobra uwaga na Trim :)
Joeppie

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

15

Spróbuj tego:

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

2
Czy rozważyłbyś trochę wyjaśnienie swojej odpowiedzi, aby inni, którzy się pojawią, mieli lepszy pomysł, dlaczego ją zasugerowałeś?
Andrew Barber,

1
Odpowiedź autorstwa @Altaf Patel wykorzystuje metodę siostrzaną String.Remove Method (Int32), która jest prawdopodobnie prostsza w tej sytuacji. Jednak dobrze jest wiedzieć o metodzie String.Remove (Int32, Int32), która oferuje możliwość przycinania podciągu o dowolnej długości z dowolnego miejsca w ciągu źródłowym.
DavidRR

13

Po prostu nie dodałbym tego w pierwszej kolejności:

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

Nie powiem nic o czytelności tego fragmentu, ale tak bym to zrobił.
Matti Virkkunen

2
Tanie i łatwe jest również skrócenie długości StringBuildera o jeden po zakończeniu pętli.
Matt Greer,

+1 za nie dodawanie go zamiast jego usunięcia, za używanie StringBuilder zamiast + = oraz za łączenie dołączeń w łańcuch zamiast łączenia i dołączania. :)
Guffa

1
Problem z tym rozwiązaniem polega na tym, że operator „if” nazywany jest „n” razy.
magallanes

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

1
From String.Remove Method (Int32) : "Zwraca nowy ciąg, w którym wszystkie znaki w bieżącej instancji, zaczynające się od określonej pozycji i kontynuujące do ostatniej pozycji, zostały usunięte."
DavidRR

7

Lepiej, jeśli używasz 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);
 }

Brakuje .ToArray()w Twoim Joinoświadczeniu. Jednak +1. Pomogło mi.
desaivv

1
@desaivv: Nie, używałem tego przeciążenia:, public static string Join<T>(string separator, IEnumerable<T> values)jest nowy w C # 4.0 :)
Cheng Chen

Ach, moja wina. Nadal używam VS2008 z
wersją

5

Dobrą praktyką jest używanie a StringBuilderpodczas łączenia wielu ciągów, a następnie możesz użyć metody Remove, aby pozbyć się ostatniego znaku.

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

Przypomniałem sobie również, że możesz użyć również paramBuilder.Length - 1do usunięcia ostatniego znaku.
Dan Diplo,

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

To działa, aby usunąć pojedynczy znak z końca łańcucha. Ale jeśli użyję go do usunięcia, powiedzmy, 4 znaków, to nie zadziała:

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

Zamiast tego użyłem tego podejścia:

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

2
Korzystanie String.Remove Method (Int32, Int32) , aby usunąć 4 znaków od końca łańcucha: result = source.Remove((source.Length - 4), 4);.
DavidRR

0

Dodaj 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;
}

następnie użyj:

yourStringBuilder.RemoveLast(",");
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.