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


94

通过以下方式为发布请求构建字符串,

  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 2010年

如果您的prodID允许包含任意字符,尤其是&,则需要确保将其正确转义,例如@MarcGravell的答案。
Evgeniy Berezovsky

Answers:


75

与构建它string.Join来代替:

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

string.Join使用分隔符("&")和字符串数组(parameters),并将分隔符插入数组的每个元素之间。


1
值得一提的是,如果您不想在字符串的末尾使用&符号,这将很有帮助。
阿马尔(Ammar)2012年

我知道这是在Ruby中,不知道它是在C#中,而且我是.net开发人员。我感到很尴尬
杰克·马尔凯蒂

我不敢相信这是选择的答案……@BrianRasmussen的下一个答案要简单得多。
FastTrack 2014年

@FastTrack解决了根本问题,而不是回答标题中的问题。我的抱怨:如果您要流利,为什么不将所有内容全部排成一行。
Graham

241

就我个人而言,我会接受Rob的建议,但如果要删除一个(或多个)特定的尾随字符,可以使用TrimEnd。例如

paramstr = paramstr.TrimEnd('&');

15
请注意,TrimEnd将删除该字符'&'的所有结尾出现,因此,如果字符串以'&&&'结尾,则TrimEnd将删除所有三个'&',而不仅仅是最后一个。这可能是OP想要的,也可能不是。
Doug S

3
@DougS FWIW我做了作家“删除一个(或多个)”。
Brian Rasmussen 2014年

+1是一个简单的解决方案,因此可以轻松用作其他问题的组成部分。我正在寻找一种解决方案,以从多个部分创建路径,以确保我没有双斜线或缺少斜线。将TrimEnd和TrimStart与该技术结合使用可确保这一点。
Joeppie 2014年

1
@Joeppie:建议使用Path.Combine,它了解所有路径分隔符。至少一口气Trim开始和结束的最少使用。
Nigel Touch

@Nigel我在Path.Combine上遇到的麻烦是,如果第二个参数以斜杠开头,则它将被解释为绝对路径,结果是绝对路径;这是我希望“节省”人们从中调用我的代码的方式。修剪的好
点儿

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
您是否会考虑解释一下您的答案,以便其他同行更好地了解您为什么提出该建议?
安德鲁·巴伯

1
@Altaf Patel 的答案使用了兄弟方法String.Remove Method(Int32),在这种情况下可以说更简单。但是,很了解String.Remove方法(Int32,Int32),该方法可以从源字符串中的任意位置修剪任意长度的子字符串。
DavidRR 2014年

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 2010年

2
循环完成后,将StringBuilder的长度缩短一倍也很便宜,也很容易。
Matt Greer 2010年

+1表示不添加而不是删除它,使用StringBuilder代替+ =,并链接附加而不是连接和附加。:)
Guffa 2010年

1
该解决方案的问题是“ if”运算符被称为“ n”次。
magallanes 2012年


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);
 }

.ToArray()Join声明中失踪了。+1。帮助过我。
desaivv 2012年

1
@desaivv:不,我正在使用此重载:public static string Join<T>(string separator, IEnumerable<T> values),它是C#4.0中的新功能:)
Cheng Chen

啊,我的坏。仍使用VS2008和3.0
desaivv 2012年

5

StringBuilder串联很多字符串时,最好使用a ,然后可以使用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方法(Int32,Int32)从字符串末尾删除4个字符:result = source.Remove((source.Length - 4), 4);
DavidRR 2014年

0

添加一个StringBuilder extension method

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