Ответ 1
strgroupids = strgroupids.Remove(strgroupids.Length - 1);
String.Remove(Int32):
Удаляет все символы из этой строки, начинающиеся с указанного положение и продолжение в последней позиции
Я получаю много информации в списке, связанном с базой данных, и я хочу создать строку групп для тех, кто подключен к веб-сайту.
Я использую это для тестирования, но это не динамично, так что это действительно плохо:
string strgroupids = "6";
Я хочу использовать это сейчас. Но возвращаемая строка имеет вид 1,2,3,4,5,
groupIds.ForEach((g) =>
{
strgroupids = strgroupids + g.ToString() + ",";
strgroupids.TrimEnd(',');
});
strgroupids.TrimEnd(new char[] { ',' });
Я хочу удалить ,
после 5
, но это, безусловно, не работает.
strgroupids = strgroupids.Remove(strgroupids.Length - 1);
String.Remove(Int32):
Удаляет все символы из этой строки, начинающиеся с указанного положение и продолжение в последней позиции
Как сделать это таким образом
strgroupids = string.Join( ",", groupIds );
A лот.
Он добавит все элементы внутри groupIds
с ','
между каждым, но в конце не будет положить ','
.
Строки в С# неизменяемы. Когда в вашем коде вы выполняете strgroupids.TrimEnd(',');
или strgroupids.TrimEnd(new char[] { ',' });
, строка strgroupids
не изменяется.
Вместо этого вам нужно сделать что-то вроде strgroupids = strgroupids.TrimEnd(',');
.
Процитировать здесь:
Строки неизменяемы - содержимое строкового объекта не может быть изменен после создания объекта, хотя синтаксис делает его как будто вы можете это сделать. Например, когда вы пишете этот код, компилятор фактически создает новый строковый объект для хранения нового последовательность символов, а новый объект присваивается b. строка "h" затем имеет право на сбор мусора.
Добавьте метод расширения.
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(",");
Удаляет любые конечные запятые:
while (strgroupids.EndsWith(","))
strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);
Это наоборот, вы написали код, который добавляет запятую в первую очередь. Вместо этого следует использовать string.Join(",",g)
, если g
- string[]
. Дайте ему лучшее имя, чем g
тоже!
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()));
В качестве альтернативы добавлению запятой для каждого элемента вы можете просто использовать String.Join:
var strgroupids = String.Join(",", groupIds);
Это добавит сепаратор ( "," в этом случае) между каждым элементом массива.
Дополнительно к решению sll: лучше обрезать строку, если в конце есть несколько пробелов.
strgroupids = strgroupids.Remove(strgroupids.Trim().Length - 1);
string.Join
лучше, но если вы действительно хотите LINQ ForEach
:
var strgroupids = string.Empty;
groupIds.ForEach(g =>
{
if(strgroupids != string.Empty){
strgroupids += ",";
}
strgroupids += g;
});
Некоторые примечания:
string.Join
и ForEach
лучше, чем это, значительно медленнее, приближаются к,
, поскольку он никогда не добавлялся+=
) удобен для добавления к строкам.ToString()
не требуется, так как он автоматически вызывается при конкатенации нестрочных символовStringBuilder
вместо конкатенации строк