Як видалити останній символ у рядку в 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 #?


2
Думаю, краще просто не додавати його спочатку, але в іншому випадку ви можете спробувати paramstr.Substring (0, paramstr.Length - 1)
Jaco Pretorius

У випадку, якщо ваш 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 видалить усі 3 з цих "&", а не лише останнє. Це може, а може і не бути тим, що хоче ОП.
Doug S

3
@DougS FWIW Я написав "видалити одного (або більше)".
Брайан Расмуссен,

+1 для простого рішення, яке, таким чином, може бути легко використано як компонент для інших проблем. Я шукав рішення для створення шляху з декількох частин, переконуючись, що у мене не було подвійних або відсутніх скісних рисок. Поєднання TrimEnd та TrimStart з цією технікою забезпечує це.
Joeppie

1
@Joeppie: пропоную використовувати Path.Combine, що розуміє всі роздільники шляхів. Найменше використання, Trimяке починається і закінчується одним рухом .
Nigel Touch

@Nigel, проблема у мене з Path.Combine полягає в тому, що якщо другий аргумент починається з косої риски, він інтерпретується як абсолютний шлях, а результат - абсолютний шлях; це те, що я вважаю за краще "рятувати" людей, які дзвонять на мій код. Хоча хороший момент на
обробці


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 на одиницю після завершення циклу.
Matt Greer

+1 за те, що не додав його замість його видалення, використовував StringBuilder замість + = і за ланцюжок додає замість конкатенації та додавання. :)
Гуффа

1
Проблема цього рішення полягає в тому, що оператор "якщо" викликається "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

1
@desaivv: Ні, я використовував це перевантаження:, public static string Join<T>(string separator, IEnumerable<T> values)це нове в C # 4.0 :)
Чен Чен

Ах, погано. Все ще використовую VS2008 з 3.0
desaivv

5

Доброю практикою є використання a 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();

Я також пам’ятав, що ви можете використовувати і paramBuilder.Length - 1для видалення останнього символу.
Dan Diplo

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

Додайте a 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(",");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.