Удалить последний символ строки

261

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

Я использую это для тестирования, но это не динамично, так что это действительно плохо:

string strgroupids = "6";

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

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

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

Я хочу удалить ,после, 5но это определенно не работает.

Kiwimoisi
источник
9
Решение прямой проблемы есть, strgroupids = strgroupids.TrimEnd(new char[] { ',' });но есть лучшие идеи ниже.
Хенк Холтерман

Ответы:

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

MSDN:

String.Remove (Int32):

Удаляет все символы из этой строки, начиная с указанной позиции и продолжая до последней позиции

SLL
источник
1
Идеально для удаления последнего символа, если вы хотите удалить последний символ. Для вопроса ОП проблема не должна существовать, если вы не создаете конечный символ. Проверьте решение @ OPyvind Bråthen, если вы находитесь в лодке OP.
aloisdg переходит на codidact.com
86

Как насчет этого

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

Много чище.

Он будет добавлять все элементы внутри groupIdsс ','между собой, но это не будет поставить ','в конце.

Ойвинд Бротен
источник
4
Только в C # 4.0. В C # 3.5 вам придется конвертировать groupIds в массив.
Ксанатос
3
Это исправит проблему с OP.
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(",");
nznoor
источник
Основная идея создания метода расширения хороша. Однако, 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);

Это добавит разделитель (в данном случае ",") между каждым элементом в массиве.

Gary.S
источник
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);
Tanzer
источник
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
ОШИБКА - нужно отменить тест if - должно бытьif(strgroupids != string.Empty){
ToolmakerSteve
Но спасибо за добавление ответа, который показывает, как использовать for-each для построения строки без нежелательного "," в конце! Обратите внимание, что нет необходимости делать лямбду и ForEach; foreach (var g in groupIds) {работает так же хорошо :)
ToolmakerSteve
n1 @ToolmakerSteve, о LINQ, тогда это код