2010-09-19 4 views
92

Построение строки для запроса пост следующим образомКак удалить последний символ в строке на 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()); 
     } 
    } 

после того, как я получаю в результате paramstr, мне нужно, чтобы удалить последний символ & в нем

Как удалить последний символ в строке с помощью C#?

+2

Угадайте, что лучше просто не добавить его в первую очередь, но в противном случае вы можете попробовать paramstr.Substring (0, paramstr.Length - 1) –

+0

В случае Вашего prodID разрешено содержать произвольные символы, особенно '&', вам нужно убедиться, что он правильно экранирован, например, ответ @MarcGravell делает. –

ответ

75

сборки его с string.Join вместо:

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

string.Join принимает Seperator ("&") и и массив строк (parameters), и вставляет Seperator между каждым элементом массива.

+1

Стоит отметить, что это полезно, если вы не хотите иметь знак & sign в конце строки. – Ammar

+0

Я знал, что это было в Ruby, и я понятия не имел, что это на C#, и я .net dev. Мне так стыдно lol –

+0

Не могу поверить, что это был выбранный ответ ... тот, что чуть ниже этого @BrianRasmussen, намного проще. – FastTrack

13

я бы просто не добавить его в первую очередь:

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

Я ничего не скажу о читабельности этого фрагмента, но я так и делал. –

+2

Это также дешево и просто, чтобы просто сократить длину StringBuilder на один после завершения цикла. –

+0

+1 для наилучшего контекстно-зависимого ответа –

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

Это хорошая практика, чтобы использовать StringBuilder при конкатенации много строк, а затем вы можете использовать метод Remove, чтобы избавиться от последний символ.

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

Я также помнил, что вы можете использовать 'paramBuilder.Length - 1', чтобы удалить последний символ. –

237

Лично я бы с предложением Роба, но если вы хотите удалить один (или более) конкретных замыкающий символ (ы), вы можете использовать TrimEnd. Например.

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

+1 для того, чтобы быть простейшим ответом на вопрос * title * –

+13

Имейте в виду, что TrimEnd удалит все завершающие вхождения этого символа '&' ... так что если строка заканчивается на '&&&', тогда TrimEnd удалит все 3 из этих '&', а не только последний. Это может быть или не быть тем, чего хочет OP. –

+3

@DougS FWIW Я писатель «удаляю один (или более)». –

7

Лучше, если вы используете 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

Отсутствует '.ToArray()' в вашей инструкции 'Join'. +1 хотя. Помог мне. –

+1

@desaivv: Нет, я использовал эту перегрузку: 'public static string Join (разделитель строк, IEnumerable значений)', это новое в C# 4.0 :) –

+0

Ahh my bad. Все еще используете VS2008 с 3.0 –

15

Попробуйте это:

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

Не могли бы вы немного объяснить свой ответ, чтобы у других, кто пришел, было лучше понять, почему вы это предложили? –

+1

[Ответ] (http://stackoverflow.com/a/15201203/1497596) by @Altaf Patel использует метод sibling [String.Remove Method (Int32)] (http://msdn.microsoft.com/en- us/library/9ad138yc% 28v = vs.110% 29.aspx), что, возможно, более прямолинейно в этой ситуации. Однако его полезно знать о [String.Remove Method (Int32, Int32)] (http://msdn.microsoft.com/en-us/library/d8d7z2kk%28v=vs.110%29.aspx), который предлагает возможность обрезать подстроку произвольной длины из любой точки исходной строки. – DavidRR

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

Из метода [String.Remove (Int32)] (http://msdn.microsoft.com/en-us/library/9ad138yc%28v=vs.110%29.aspx): * "Возвращает новую строку, в которой все символы в текущем экземпляре, начинающиеся в указанной позиции и продолжающиеся в последней позиции, были удалены. "* – DavidRR

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

Это работа для удаления одного символа с конца строки. Но если я использую его, чтобы удалить, скажем, символов, это не работает:

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

В качестве альтернативы, я использовал этот подход вместо:

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

Использование метода [String.Remove (Int32, Int32)] (http://msdn.microsoft.com/ru -us/library/d8d7z2kk% 28v = vs.110% 29.aspx), чтобы удалить ** 4 ** символов из конца строки: 'result = source.Remove ((source.Length - 4), 4) ; '. – DavidRR

0

Добавить в 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; 
} 

затем использовать:

yourStringBuilder.RemoveLast(",");