2010-09-19 12 views
92

Budowanie ciąg dla postu wniosek w następujący sposóbJak usunąć ostatni znak w ciągu znaków w C#?

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 dostaję wynikające paramstr, muszę usunąć ostatni znak & w nim

Jak usunąć ostatni znak w ciąg korzystania DO#?

+2

Chyba lepiej po prostu nie dodać go na pierwszym miejscu, ale w przeciwnym razie można spróbować paramstr.Substring (0, paramstr.Length - 1) W przypadku, gdy –

+0

prodID może zawierać dowolne znaki, szczególnie '&', musisz upewnić się, że dostaje poprawnie uciekł, np odpowiedź @MarcGravell ma. –

Odpowiedz

75

budowy to string.Join Zamiast:

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

string.Join wykonuje separator ("&") i oraz szereg łańcuchów (parameters) i wstawia separator pomiędzy każdym z elementów macierzy.

+1

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

+0

Wiedziałem, że to było w Ruby, nie miałem pojęcia, że ​​jest w C# i jestem dev .net. Czuję się tak zawstydzony. Lol –

+0

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

13

ja po prostu nie dodawać go 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(); 
+0

Nie powiem nic o czytelności tego fragmentu, ale w ten sposób to zrobię. –

+2

Jest również tanie i łatwe do skrócenia długości StringBuilder o jeden po zakończeniu pętli. –

+0

+1 dla najlepszej odpowiedzi kontekstowej –

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

Jest to dobra praktyka, aby użyć StringBuilder gdy łącząc wiele strun i można wtedy użyć metody Remove pozbyć ostatnia postać.

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

Zapamiętałem też, że możesz użyć 'paramBuilder.Length - 1', aby usunąć także ostatni znak. –

237

Osobiście pójdę z sugestią Roba, ale jeśli chcesz, aby usunąć jeden (lub więcej) znak (ów) specyficzny spływu można użyć TrimEnd. Na przykład.

paramstr = paramstr.TrimEnd('&'); 
+44

+1 za bycie najprostszą odpowiedzią na pytanie * tytuł * –

+13

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 3 z nich "&", nie tylko ten ostatni. To może, ale nie musi być tym, co chce OP. –

+3

@DougS FWIW Zrobiłem pisarz "usuń jeden (lub więcej)". –

7

To 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); 
} 
+0

Brakuje '.ToArray()' w swoim poleceniu 'Join'. +1. Pomogło mi. –

+1

@desaivv: Nie, używałam tego przeciążenia: 'public static string Dołącz (separator łańcuchów, IEnumerable wartości)', jest nowy w języku C# 4.0 :) –

+0

Ahh mój zły. Nadal korzystasz z VS2008 z 3.0 –

15

Spróbuj tego:

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

Czy mógłbyś nieco wyjaśnić swoją odpowiedź, aby inni, którzy do nas przychodzą, mieli lepszy pomysł, dlaczego to zasugerowałeś? –

+1

[Odpowiedź] (http://stackoverflow.com/a/15201203/1497596) autorstwa @Altaf Patel używa metody rodzeństwa [Metoda String.Remove (Int32)] (http://msdn.microsoft.com/en- us/library/9ad138yc% 28v = vs.110% 29.aspx), co jest prawdopodobnie prostsze w tej sytuacji. Jednak dobrze wiedzieć o [String.Remove Method (Int32, Int32)] (http://msdn.microsoft.com/en-us/library/d8d7z2kk%28v=vs.110%29.aspx), który oferuje możliwość przycinania podciągu o dowolnej długości z dowolnego miejsca w ciągu źródłowym. – DavidRR

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

From [String.Remove Method (Int32)] (http://msdn.microsoft.com/en-us/library/9ad138yc%28v=vs.110%29.aspx): * "Zwraca nowy ciąg, w którym wszystkie znaki w bieżącej instancji, rozpoczynające się od określonej pozycji i przechodzące przez ostatnią pozycję, zostały usunięte. "* – DavidRR

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

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

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

Jako alternatywę Użyłem tej metody Zamiast:

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

Używanie [metody String.Remove (Int32, Int32)] (http://msdn.microsoft.com/pl -us/library/d8d7z2kk% 28v = vs.110% 29.aspx), aby usunąć ** 4 ** znaków z końca ciągu: 'result = source.Remove ((source.Length - 4), 4) ; '. – DavidRR

0

dodać StringBuilderextension 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żyć:

yourStringBuilder.RemoveLast(","); 
Powiązane problemy