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

94

Строим строку для почтового запроса следующим образом:

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

rem
источник
2
Думаю, лучше просто не добавлять его в первую очередь, но в противном случае вы можете попробовать paramstr.Substring (0, paramstr.Length - 1)
Жако Преториус
В случае, если ваш prodID может содержать произвольные символы, особенно &вам нужно убедиться, что он правильно экранирован, как, например, ответ @MarcGravell.
Евгений Березовский

Ответы:

75

string.Joinвместо этого создайте его :

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

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

Роб Фонсека-Энсор
источник
1
Стоит отметить, что это полезно, если вы не хотите, чтобы в конце строки был знак &.
Аммар
Я знал, что это на Ruby, понятия не имел, что это на C #, и я разработчик .net. Я так смущен, смеется
Джек Маркетти
Я не могу поверить, что это был выбранный ответ ... тот, который чуть ниже @BrianRasmussen, намного проще.
FastTrack
@FastTrack Он решил основную проблему, а не ответил на вопрос в заголовке. Моя жалоба: если вы собираетесь говорить бегло, почему бы просто не сделать все в одну строчку.
Грэм
241

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

paramstr = paramstr.TrimEnd('&');
Брайан Расмуссен
источник
15
Имейте в виду, что TrimEnd удалит все конечные вхождения этого символа '&' ... поэтому, если строка заканчивается на '&&&', то TrimEnd удалит все три из этих '&', а не только последний. Это может быть, а может и не быть тем, чего хочет ОП.
Doug S
3
@DougS FWIW Я написал "удалить один (или несколько)".
Брайан Расмуссен
+1 за простое решение, которое, таким образом, можно легко использовать в качестве компонента для других проблем. Я искал решение для создания пути из нескольких частей, чтобы у меня не было двойных или пропущенных косых черт. Это обеспечивает сочетание TrimEnd и TrimStart с этой техникой.
Joeppie
1
@Joeppie: предлагаю использовать Path.Combine, который понимает все разделители путей. По крайней мере, используйте то, Trimчто начинается и заканчивается за один раз.
Найджел Тач
@Nigel, проблема с Path.Combine заключается в том, что если второй аргумент начинается с косой черты, он интерпретируется как абсолютный путь, а результатом является абсолютный путь; это то, что я предпочитаю «спасать» людей, вызывающих мой код. Хорошая точка зрения на Trim :)
Joeppie
22
string source;
// source gets initialized
string dest;
if (source.Length > 0)
{
    dest = source.Substring(0, source.Length - 1);
}
Стив Таунсенд
источник
15

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

paramstr.Remove((paramstr.Length-1),1);
Нельсон Т. Джозеф
источник
2
Не могли бы вы немного объяснить свой ответ, чтобы другие, кто придет, лучше поняли, почему вы это предложили?
Эндрю Барбер,
1
В ответе @Altaf Patel используется родственный метод String.Remove Method (Int32), который, возможно, более прост в этой ситуации. Однако полезно знать о методе String.Remove (Int32, Int32), который предлагает возможность обрезать подстроку произвольной длины из любого места в исходной строке.
DavidRR
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();
Марк Гравелл
источник
Я не буду ничего говорить о читабельности этого фрагмента, но я бы сделал это так.
Матти Вирккунен
2
Также дешево и легко просто сократить длину StringBuilder на единицу после завершения цикла.
Мэтт Грир,
+1 для того, чтобы не добавлять его вместо удаления, для использования StringBuilder вместо + = и для цепочки добавлений вместо конкатенации и добавления. :)
Guffa
1
Проблема с этим решением в том, что оператор if вызывается n раз.
magallanes
11
string str="This is test string.";
str=str.Remove(str.Length-1);
Альтаф Патель
источник
1
Из метода String.Remove (Int32) : «Возвращает новую строку, в которой все символы в текущем экземпляре, начиная с указанной позиции и продолжаясь до последней позиции, были удалены».
DavidRR
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);
 }
Ченг Чен
источник
Вы пропали .ToArray()в своем Joinзаявлении. +1 хотя. Помог мне.
desaivv 06
1
@desaivv: Нет, я использовал эту перегрузку:, public static string Join<T>(string separator, IEnumerable<T> values)она новая в C # 4.0 :)
Cheng Chen
Ах, моя проблема. Все еще использую VS2008 с 3.0
desaivv 06
5

StringBuilderПри объединении большого количества строк рекомендуется использовать a, а затем вы можете использовать метод 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();
Дэн Дипло
источник
Я также вспомнил, что вы также можете использовать paramBuilder.Length - 1для удаления последнего символа.
Дэн Дипло
1
paramstr.Remove((paramstr.Length-1),1);

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

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

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

DateFrom = DateFrom.Substring(0, DateFrom.Length-4);
Узаир Заман Шейх
источник
2
Используя String.Remove метод (Int32, Int32) , чтобы удалить 4 символов с конца строки: result = source.Remove((source.Length - 4), 4);.
DavidRR
0

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

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

yourStringBuilder.RemoveLast(",");
Nznoor
источник