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

338

我正在从数据库中检索大量的信息,放在一个列表中,我想为连接到该网站的某个人创建一个组字符串。

我使用这个来测试,但是这不是动态的,所以它真的很糟糕:

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[] { ',' });,但下面有更好的想法。 - H H
12个回答

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

MSDN:

String.Remove(Int32):

该方法从指定的位置开始删除当前字符串中的所有字符,一直到最后一个位置。


1
如果您想要删除最后一个字符,那么这段代码非常适合。对于OP的问题,如果您不创建尾随字符,则该问题不应存在。如果您遇到了OP的问题,请查看@Øyvind Bråthen的解决方案。 - aloisdg
在执行此操作之前,请确保检查字符串的“Length”,因为它可能为空,您提供给“Remove”方法的索引将是无效的负数。 - baltermia

113

这种方式怎么样?

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

更加简洁。

它将在groupIds内的所有元素之间添加一个',',但不会在末尾放置','


4
只有在C# 4.0中才支持,如果你使用C# 3.5版本,则需要将groupIds转换为数组。 - xanatos
3
这个可以解决原帖作者的问题。 - aloisdg

45
在C# 8中,引入了范围和索引,为我们提供了一种更加简洁的解决方案:
strgroupids = strgroupids[..^1];

1
甚至只需使用 strgroupids = strgroupids[..^1];,您就可以通过 if(strgroupids[^1] == ',') 测试最后一个字符。 - Olivier Jacot-Descombes
谢谢@OlivierJacot-Descombes,这是一个很好的观点。我已经更新了答案并删去了冗余字符。 - Dodgyrabbit
我在我的小型项目应用程序中使用了这个解决方案!感谢分享新的语言特性。 - bombek

40

C#中的字符串是不可变的。 当您在代码中执行 strgroupids.TrimEnd(',');strgroupids.TrimEnd(new char[] { ',' }); 时,strgroupids 字符串未被修改。

您需要像这样做 strgroupids = strgroupids.TrimEnd(','); 才行。

引用自此处:

字符串是不可变的——在创建对象后,字符串对象的内容不能更改,尽管语法似乎允许你这样做。例如,当您编写此代码时,编译器实际上会创建一个新的字符串对象来保存新的字符序列,并将该新对象分配给b。 然后字符串"h"就可以进行垃圾回收。


15

添加扩展方法。

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 更加适合使用。但是请等一下,它已经存在了——在原始问题和三年前的几个其他答案中都提到过——没有必要发明一个新的方法!你的方法有什么好处? - ToolmakerSteve

9

去除任何末尾的逗号:

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

然而,这样做是反向的,因为您编写了添加逗号的代码。 假设 g 是一个 string[],则应改用 string.Join(",",g)。 同时,使用比 g 更好的名称!


5

除了sll的解决方案之外:最好修剪字符串,以防止末尾存在一些空格。

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

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
string.Join 是完美的,如果你的源是一个字符串数组或者你使用的是 C# 4.0 版本。 - xanatos

3

string.Join 更好,但如果你真的想要使用 LINQ 的 ForEach

var strgroupids = string.Empty;

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

    strgroupids += g;
});

一些注意事项:

  • string.Joinforeach 都比这种方法要好得多,速度更快。
  • 没有必要删除最后一个 ,,因为它永远不会被添加。
  • 增量运算符 (+=) 对于追加字符串非常方便。
  • .ToString() 是不必要的,因为在连接非字符串时会自动调用。
  • 在处理大型字符串时,应该考虑使用 StringBuilder 替代字符串连接。

1
BUG - 需要反转if测试 - 应该是if(strgroupids != string.Empty){ - ToolmakerSteve
但是感谢您添加了一个答案,展示了如何使用for-each构建字符串,而不会在末尾产生不需要的“,”!请注意,没有必要创建lambda和ForEachforeach(var g in groupIds){同样适用 :) - ToolmakerSteve
n1 @ToolmakerSteve,关于LINQ,这是我采用的OPs代码。 - user3638471

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接