删除字符串的最后一个字符


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[] { ',' });但是下面有更好的主意。
汉克·霍尔特曼

Answers:


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

MSDN:

String.Remove(Int32):

从该字符串中删除从指定位置开始到最后一个位置的所有字符


1
如果要删除最后一个字符,完美删除最后一个字符。对于OP的问题,如果您不创建结尾字符,则该问题不应存在。如果您在OP的船上,请检查@ØyvindBråthen解决方案。
aloisdg移至codidact.com,2018年


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

创建扩展方法的基本思想是好的。但是,恕我直言,对于这种用法,此处实现的方法过大。OP知道他想要的字符在字符串的末尾,因此没有理由通过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 2011年

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

但是,谢谢您添加了一个答案,该答案显示了如何使用for-each来构建字符串,而结尾没有多余的“,”!请注意,不必制作lambda和ForEach; foreach (var g in groupIds) {效果也一样:)
ToolmakerSteve

n1 @ToolmakerSteve,关于LINQ,这是我采用的OPs代码
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.