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

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

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

string strgroupids = "6";

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

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

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

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

Ответ 1

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

MSDN:

String.Remove(Int32):

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

Ответ 2

Как сделать это таким образом

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

A лот.

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

Ответ 3

Строки в С# неизменяемы. Когда в вашем коде вы выполняете strgroupids.TrimEnd(','); или strgroupids.TrimEnd(new char[] { ',' });, строка strgroupids не изменяется.

Вместо этого вам нужно сделать что-то вроде strgroupids = strgroupids.TrimEnd(',');.

Процитировать здесь:

Строки неизменяемы - содержимое строкового объекта не может быть изменен после создания объекта, хотя синтаксис делает его как будто вы можете это сделать. Например, когда вы пишете этот код, компилятор фактически создает новый строковый объект для хранения нового последовательность символов, а новый объект присваивается b. строка "h" затем имеет право на сбор мусора.

Ответ 4

Добавьте метод расширения.

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(",");

Ответ 5

Удаляет любые конечные запятые:

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

Это наоборот, вы написали код, который добавляет запятую в первую очередь. Вместо этого следует использовать string.Join(",",g), если g - string[]. Дайте ему лучшее имя, чем g тоже!

Ответ 6

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()));

Ответ 7

В качестве альтернативы добавлению запятой для каждого элемента вы можете просто использовать String.Join:

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

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

Ответ 8

Дополнительно к решению sll: лучше обрезать строку, если в конце есть несколько пробелов.

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

Ответ 9

string.Join лучше, но если вы действительно хотите LINQ ForEach:

var strgroupids = string.Empty;

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

    strgroupids += g;
});

Некоторые примечания:

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