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

C# 删除字符串的最后一个字符,c#,string,char,C#,String,Char,我正在检索一个列表中的大量信息,链接到一个数据库,我想为连接到该网站的人创建一个组字符串 我用它来测试,但这不是动态的,所以它非常糟糕: string strgroupids = "6"; 我现在想用这个。但是返回的字符串类似于1,2,3,4,5, groupIds.ForEach((g) => { strgroupids = strgroupids + g.ToString() + ","; strgroupids.TrimEnd(','); }); strgrou

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

我用它来测试,但这不是动态的,所以它非常糟糕:

string strgroupids = "6";
我现在想用这个。但是返回的字符串类似于
1,2,3,4,5,

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

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

我想在
5
之后删除
,但它肯定不起作用

删除任何尾随逗号:

while (strgroupids.EndsWith(","))
    strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);
但这是向后的,您首先编写了添加逗号的代码。您应该使用
string.Join(“,”,g)
,假设
g
string[]
。给它一个比
g
更好的名字

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

字符串。删除(Int32):

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


这样做怎么样

strgroupids = string.Join( ",", groupIds );
一批清洁剂

它将在
groupid
中的所有元素之间添加一个
,'
,但不会在末尾添加一个
,'

string strgroupids = string.Empty;

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

strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);
注意这里使用的
ForEach
通常被认为是“错误的”(例如阅读)

使用一些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()));

作为为每个项目添加逗号的替代方法,您可以仅使用字符串。连接:

var strgroupids = String.Join(",",  groupIds);
这将在数组中的每个元素之间添加分隔符(“,”)

c#中的字符串是不可变的。在代码中执行
strgroupids.TrimEnd(',')
strgroupids.TrimEnd(新字符[]{',})未修改
strgroupids
字符串

您需要执行类似以下操作:
strgroupids=strgroupids.TrimEnd(',')取而代之

引自:

字符串是不可变的——不能更改字符串对象的内容 创建对象后更改,尽管语法使其 看起来好像你能做到这一点。例如,当您编写此代码时, 编译器实际上创建了一个新字符串对象来保存新字符串 字符序列,并且该新对象被指定给b。这个 然后字符串“h”有资格进行垃圾收集


补充sll的解决方案:最好修剪字符串,以防末尾出现空白

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

添加一个扩展方法

public static string RemoveLast(this string text, string character)
{
    if(text.Length < 1) return text;
    return text.Remove(text.ToString().LastIndexOf(character), character.Length);
}

string.Join
更好,但如果您真的想要LINQ
ForEach

var strgroupids = string.Empty;

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

    strgroupids += g;
});
一些注意事项:

  • string.Join
    foreach
    都比这种速度慢得多的方法要好
  • 无需删除最后一个
    ,因为它从未追加
  • 增量运算符(
    +=
    )便于附加到字符串
  • .ToString()
    是不必要的,因为在连接非字符串时会自动调用它
  • 处理大字符串时,应考虑使用
    StringBuilder
    ,而不是串联字符串
没有“快速而肮脏”的方法可以做到这一点。我通常会:

mystring= string.Concat(mystring.Take(mystring.Length-1));
在C#8中引入了一种新的更简洁的解决方案:

strgroupids = strgroupids[..^1];

只有在C#4.0中。在C#3.5中,您必须将GroupID转换为数组。这将解决OP问题。直接问题的解决方案是
strgroupids=strgroupids.TrimEnd(新字符[]{',})但是下面有更好的主意。@KierenJohnstone
string.Join
是完美的,如果你有一个字符串数组作为源或者你有C#4.0BUG-需要反转IF测试-应该是
IF(strgroupids!=string.Empty){
但感谢您添加了一个答案,该答案显示了如何使用for each构建字符串,而不在末尾添加不需要的“,”。请注意,不需要创建lambda和
ForEach
ForEach(groupIds中的var g){
同样有效:)n1@ToolmakerSteve,关于LINQ,然后是OPs代码I Took创建扩展方法的基本思想是好的。但是,IMHO,这里实现的方法对于这种用法来说是过度的。OP知道他想要的字符在字符串的末尾,所以没有理由花费搜索该字符串的费用,viLastIndexOf。只需接受接受的答案,并将其作为一个扩展方法。或者通过在末尾传递
int n
,要删除的字符数来概括该答案。其次,测试零长度,但这并不能消除所有可能的异常。最好执行
int index=…LastIndexOf..
,然后
如果(索引>=0)第三。参数<代码>字符串字符< /C>是不好命名的。第四,对于未来程序员来说,在字符串末尾删除字符是不太明显的。哦,等等,它不一定是这样。它正在搜索字符串。它可以从中间的某个地方删除。现在维护程序员有t。o检查该方法的所有用途,看看试图实现什么。对于从字符串末尾删除的简单需要,调用该方法不是一个好方法。对于所有批评,我深表歉意;我这样做是为了任何采用该方法的人,让他们理解。第五,在问题的上下文中,
string.TrimEnd
更适合o使用。但是,等等,这已经存在了——并且在最初的问题和3年前的几个其他答案中提到过——没有必要发明一种新方法!你的方法的好处是什么?如果你想删除最后一个字符,最好删除最后一个字符。对于OP的问题,如果你不创建尾随字符,这个问题就不应该存在。检查@Øyvind Bråthen solution if you in OP's boat.或者甚至只
strgroupids=strgroupids[..^1];
,您可以使用
if(strgroupids[^1]==',')测试最后一个字符。
谢谢@OlivierJacot Descombes,这是一个很好的观点。我已经更新了答案并删除了多余的字符。
strgroupids = strgroupids[..^1];