Видалити останній символ рядка


259

Я отримую багато інформації у списку, пов’язаному з базою даних і хочу створити рядок груп для тих, хто підключений до веб-сайту.

Я використовую це для тестування, але це не динамічно, тому це дуже погано:

string strgroupids = "6";

Я хочу зараз цим скористатися. Але повернутий рядок - це щось на кшталт1,2,3,4,5,

groupIds.ForEach((g) =>
{
    strgroupids = strgroupids  + g.ToString() + ",";
    strgroupids.TrimEnd(',');
});

strgroupids.TrimEnd(new char[] { ',' });

Я хочу видалити ,після, 5але це точно не працює.


9
Вирішення прямої проблеми є, strgroupids = strgroupids.TrimEnd(new char[] { ',' });але нижче є кращі ідеї.
Хенк Холтерман

Відповіді:


613
strgroupids = strgroupids.Remove(strgroupids.Length - 1);

MSDN:

String.Remove (Int32):

Видаляє всі символи з цього рядка, починаючи з заданої позиції та продовжуючи останню позицію


1
Ідеально підходить для видалення останнього знака, якщо ви хочете видалити останній знак. Що стосується питання ОП, проблема не повинна існувати, якщо ви не створюєте заднім символом. Перевірте рішення @ Øyvind Bråthen, якщо ви знаходитесь у човні OP.
aloisdg переходить на codidact.com

86

Що робити з цим способом

strgroupids = string.Join( ",", groupIds );

Багато чистіше.

Він буде додавати всі елементи всередині groupIdsз ','між собою, але це не буде поставити ','в кінці.


4
Тільки в C # 4.0. У C # 3.5 вам доведеться конвертувати groupIds в масив.
xanatos

3
Це дозволить вирішити проблему з ОП.
aloisdg переходить на codidact.com

29

Рядки в c # незмінні. Коли у вашому коді ви strgroupids.TrimEnd(',');або рядок не змінюється .strgroupids.TrimEnd(new char[] { ',' });strgroupids

Вам потрібно зробити щось подібне strgroupids = strgroupids.TrimEnd(',');замість цього.

Цитувати звідси :

Рядки незмінні - вміст рядкового об'єкта не може бути змінено після створення об’єкта, хоча синтаксис видає, що ви можете це зробити. Наприклад, коли ви пишете цей код, компілятор фактично створює новий рядковий об'єкт для утримання нової послідовності символів, і цей новий об'єкт присвоюється b. Потім рядок "h" є придатним для збору сміття.


11

Додати метод розширення.

public static string RemoveLast(this string text, string character)
{
    if(text.Length < 1) return text;
    return text.Remove(text.ToString().LastIndexOf(character), character.Length);
}

тоді використовуйте:

yourString.RemoveLast(",");

Основна ідея створення методу розширення - це добре. Однак IMHO, метод, реалізований тут, є надмірним для цього використання. ОП знав, що потрібний йому персонаж знаходиться в кінці рядка, тому немає ніяких причин мати витрати на пошук цієї рядки через LastIndexOf. Просто візьміть прийняту відповідь і зробіть її методом розширення. Або узагальнити цю відповідь, ввівши int nкількість символів, які потрібно видалити наприкінці. По-друге, ви перевіряєте нульову довжину, але це не усуває всіх можливих винятків. int index = ..LastIndexOf..Тоді було б краще зробити if (index >= 0).
ToolmakerSteve

По-третє, параметр string characterпогано названий. По-четверте, майбутнім програмістам не відразу очевидно, що це видалення символів в кінці рядка. О, зачекайте, це не обов'язково робити так. Це пошук рядка. Це може бути видалення звідкись посередині. Тепер програміст з технічного обслуговування повинен вивчити всі способи використання методу, щоб побачити, що намагалися досягти. Не дуже вдалий метод для виклику, для цієї простої необхідності видалення з кінця рядка. Вибачте за всю критику; Я роблю це для всіх, хто застосовує цей метод, щоб вони зрозуміли.
ToolmakerSteve

По-п’яте, у контексті питання String.TrimEndбуло б доцільніше використовувати. Але зачекайте, що вже існує - і згадувалося в оригінальному питанні та кількох інших відповідях 3 роки тому - не потрібно вигадувати новий метод! Яка користь від вашого підходу?
ToolmakerSteve

7

Видаляє будь-які затримки:

while (strgroupids.EndsWith(","))
    strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);

Це все назад, але ви написали код, який додає коску в першу чергу. Ви повинні використовувати string.Join(",",g)замість цього, припускаючи, що gце string[]. Назвіть це краще ім'я, ніж gтеж!


4

В якості альтернативи доданню коми для кожного елемента ви можете просто використовувати String.Join:

var strgroupids = String.Join(",",  groupIds);

Це додасть сеператор ("," у цьому випадку) між кожним елементом масиву.


3
string strgroupids = string.Empty;

groupIds.ForEach(g =>
{
    strgroupids = strgroupids + g.ToString() + ",";
});

strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);

Зауважте, що використання ForEachтут зазвичай вважається "неправильним" (читайте, наприклад, http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx )

Використання деяких LINQ:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => p + q + ',');
strgroupids = strgroupids.Substring(0, str1.Length - 1);

Без кінцевої підрядки:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => (p != string.Empty ? p + "," + q : q.ToString()));

1
@KierenJohnstone string.Join- це ідеально, якщо у вас є джерело масиву рядків АБО у вас є C # 4.0
xanatos

3

Додатково до рішення sll: Краще обрізати рядок у випадку, якщо в кінці є деякі порожні (і).

strgroupids = strgroupids.Remove(strgroupids.Trim().Length - 1);

2

string.Joinкраще, але якщо ви дійсно хочете LINQ ForEach:

var strgroupids = string.Empty;

groupIds.ForEach(g =>
{
    if(strgroupids != string.Empty){
        strgroupids += ",";
    }

    strgroupids += g;
});

Деякі примітки:

  • string.Joinі foreachобидва кращі, ніж цей, набагато повільніше, підхід
  • Не потрібно видаляти останню, ,оскільки вона ніколи не додається
  • Оператор приросту ( +=) зручний для додавання до рядків
  • .ToString() є непотрібним, оскільки його називають автоматично при об'єднанні не рядків
  • При обробці великих струн StringBuilderслід враховувати замість об'єднувальних рядків

1
BUG - потрібно скасувати тест if - повинен бутиif(strgroupids != string.Empty){
ToolmakerSteve

Але дякую, що додали відповідь, яка показує, як використовувати для кожного для створення рядка без небажаного "," наприкінці! Зауважте, що не потрібно робити лямбда і ForEach; foreach (var g in groupIds) {працює так само добре :)
ToolmakerSteve

n1 @ToolmakerSteve, про LINQ, тоді це код
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.