如何在C#中删除字符串的最后一个字符?

94

按照以下方式构建POST请求的字符串:

  var itemsToAdd = sl.SelProds.ToList();
  if (sl.SelProds.Count() != 0)
  {
      foreach (var item in itemsToAdd)
      {
        paramstr = paramstr + string.Format("productID={0}&", item.prodID.ToString());
      }
  }

在得到结果为paramstr后,我需要删除它的最后一个字符 &

如何使用C#删除字符串中的最后一个字符?


2
最好的做法是一开始就不要添加它,但如果必须添加,你可以尝试使用paramstr.Substring(0, paramstr.Length - 1)。 - Jaco Pretorius
如果您的prodID允许包含任意字符,特别是&,则需要确保它得到适当的转义,例如@MarcGravell的答案所示。 - Evgeniy Berezovsky
10个回答

241

个人而言,我会选择Rob的建议,但是如果你想去掉一个(或多个)特定的结尾字符,你可以使用TrimEnd。例如:

paramstr = paramstr.TrimEnd('&');

16
请注意,TrimEnd会删除该字符“&”的所有尾随出现...因此,如果字符串以“&&&”结尾,则TrimEnd将删除所有3个“&”,而不仅仅是最后一个。这可能是原帖作者想要的,也可能不是。 - Doug S
3
@DougS 顺便说一下,我确实写了“删除一个(或多个)”。 - Brian Rasmussen
+1 是为了提供一个简单的解决方案,以便可以轻松地将其用作其他问题的组件。我正在寻找一种从多个部分创建路径的解决方案,确保我没有重复或缺少斜杠。使用 TrimEnd 和 TrimStart 结合这种技术可以确保这一点。 - Joeppie
1
@Joeppie:建议使用Path.Combine,它可以理解所有路径分隔符。至少使用 Trim,可以一次性完成开头和结尾的处理。 - Nigel Touch
@Nigel,我使用Path.Combine时遇到的问题在于,如果第二个参数以斜杠开头,则会将其解释为绝对路径,并且结果是绝对路径;这是我不希望从我的代码中“保存”调用者的内容。不过关于Trim的建议很好 :) - Joeppie

76

使用string.Join进行构建:

var parameters = sl.SelProds.Select(x=>"productID="+x.prodID).ToArray();
paramstr = string.Join("&", parameters);

string.Join接受一个分隔符("&")和字符串数组(parameters),并在数组中的每个元素之间插入该分隔符。


1
值得注意的是,如果您不想在字符串末尾有一个&符号,则这很有帮助。 - Ammar
我知道这是用Ruby写的,但不知道它也可以用C#写,而我是一个.NET开发人员。感觉好尴尬啊哈哈。 - Jack Marchetti
我简直不敢相信这被选为答案……下面那个由@BrianRasmussen提供的要简单得多。 - FastTrack
@FastTrack解决了根本问题,而不是回答标题中的问题。我的抱怨是:如果你要流利,为什么不一次性完成所有操作呢? - Graham

22
string source;
// source gets initialized
string dest;
if (source.Length > 0)
{
    dest = source.Substring(0, source.Length - 1);
}

15

试一下这个:

paramstr.Remove((paramstr.Length-1),1);

2
你可以详细解释一下你的回答吗?这样其他人看到后就会更清楚你为什么建议这样做。 - Andrew Barber
1
@Altaf Patel的答案使用了兄弟方法String.Remove Method (Int32),在这种情况下可能更加直接。然而,了解String.Remove Method (Int32, Int32)也是很好的,它提供了从源字符串中任意位置删除任意长度子字符串的能力。 - DavidRR

13

我会一开始就不添加它:

 var sb = new StringBuilder();

 bool first = true;
 foreach (var foo in items) {
    if (first)
        first = false;
    else
        sb.Append('&');

    // for example:
    var escapedValue = System.Web.HttpUtility.UrlEncode(foo);

    sb.Append(key).Append('=').Append(escapedValue);
 }

 var s = sb.ToString();

我不会对这段代码的可读性做任何评价,但这是我会采取的方式。 - Matti Virkkunen
2
在循环完成后,将StringBuilder的长度减少一个字符也很简单、便宜。 - Matt Greer
使用StringBuilder代替+=,并且链式连接append而不是拼接和追加,这样做比删除并添加更好。 :) - Guffa
1
这个解决方案的问题在于“if”运算符被调用了“n”次。 - magallanes

11
string str="This is test string.";
str=str.Remove(str.Length-1);

1
String.Remove Method (Int32)中得知:“返回一个新字符串,其中删除了当前实例中从指定位置开始并继续到最后一个位置的所有字符。” - DavidRR

7

如果您使用string.Join会更好。

 class Product
 {
   public int ProductID { get; set; }
 }
 static void Main(string[] args)
 {
   List<Product> products = new List<Product>()
      {   
         new Product { ProductID = 1 },
         new Product { ProductID = 2 },
         new Product { ProductID = 3 }
      };
   string theURL = string.Join("&", products.Select(p => string.Format("productID={0}", p.ProductID)));
   Console.WriteLine(theURL);
 }

你的Join语句中缺少.ToArray()。虽然如此,还是谢谢你帮了我一个忙。 - One-One
1
@desaivv:不,我使用的是这个重载:public static string Join<T>(string separator, IEnumerable<T> values),它是C# 4.0中的新功能 :) - Cheng Chen
啊,我的错。我还在使用带有3.0版本的VS2008。 - One-One

5

在连接大量字符串时,使用 StringBuilder 是一个很好的实践方法,然后可以使用 Remove 方法来去除最后一个字符。

StringBuilder paramBuilder = new StringBuilder();

foreach (var item in itemsToAdd)
{
    paramBuilder.AppendFormat(("productID={0}&", item.prodID.ToString());
}

if (paramBuilder.Length > 1)
    paramBuilder.Remove(paramBuilder.Length-1, 1);

string s = paramBuilder.ToString();

我还记得你也可以使用 paramBuilder.Length - 1 来删除最后一个字符。 - Dan Diplo

1
paramstr.Remove((paramstr.Length-1),1);

这种方法可以删除字符串末尾的单个字符。但是如果我用它来删除,比如4个字符,这种方法就不起作用:
paramstr.Remove((paramstr.Length-4),1);

作为替代方案,我使用了以下方法:
DateFrom = DateFrom.Substring(0, DateFrom.Length-4);

2
使用String.Remove Method (Int32, Int32)方法,从字符串的末尾删除4个字符:result = source.Remove((source.Length - 4), 4); - DavidRR

0
添加一个 StringBuilder扩展方法
public static StringBuilder RemoveLast(this StringBuilder sb, string value)
{
    if(sb.Length < 1) return sb;
    sb.Remove(sb.ToString().LastIndexOf(value), value.Length);
    return sb;
}

然后使用:

yourStringBuilder.RemoveLast(",");

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