【问题标题】:How to delete last character in a string in C#?如何在C#中删除字符串中的最后一个字符?
【发布时间】:2011-04-14 08:04:49
【问题描述】:

通过以下方式为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# 删除 字符串 中的最后一个字符?

【问题讨论】:

  • 猜一开始最好不要添加,否则你可以试试 paramstr.Substring(0, paramstr.Length - 1)
  • 如果您的 prodID 允许包含任意字符,尤其是 &,您需要确保它被正确转义,例如@MarcGravell 的回答确实如此。

标签: c# string


【解决方案1】:

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

paramstr = paramstr.TrimEnd('&');

【讨论】:

  • 请注意,TrimEnd 将删除该字符 '&' 的所有尾随出现...因此,如果字符串以 '&&&' 结尾,则 TrimEnd 将删除所有 3 个 '&',而不仅仅是最后一个。这可能是也可能不是 OP 想要的。
  • @DougS FWIW 我写了“删除一个(或多个)”。
  • +1 是一个简单的解决方案,因此可以很容易地用作其他问题的组件。我正在寻找一种从多个部分创建路径的解决方案,以确保我没有双斜杠或缺少斜杠。将 TrimEnd 和 TrimStart 与此技术结合可确保这一点。
  • @Joeppie:建议使用Path.Combine,它可以理解所有路径分隔符。 Leastways 使用Trim,它可以一次性开始和结束。
  • @Nigel 我在使用 Path.Combine 时遇到的问题是,如果第二个参数以斜杠开头,则将其解释为绝对路径,结果是绝对路径;这是我更喜欢“拯救”人们调用我的代码的东西。不过,Trim 的要点是:)
【解决方案2】:

改用string.Join 构建它:

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

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

【讨论】:

  • 值得注意的是,如果您不想在字符串末尾有 & 符号,这很有帮助。
  • 我知道这是用 Ruby 编写的,但不知道它是用 C# 编写的,而且我是 .net 开发人员。我觉得好尴尬哈哈
  • 我不敢相信这是选择的答案...@BrianRasmussen 在此下方的答案要简单得多。
  • @FastTrack 它解决了根本问题,而不是回答标题中的问题。我的抱怨:如果你想流利,为什么不把所有的东西都写在一条线上。
【解决方案3】:
string source;
// source gets initialized
string dest;
if (source.Length > 0)
{
    dest = source.Substring(0, source.Length - 1);
}

【讨论】:

    【解决方案4】:

    试试这个:

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

    【讨论】:

    • 您是否考虑稍微解释一下您的答案,以便其他人更好地了解您为什么建议它?
    • The answer by @Altaf Patel 使用兄弟方法 String.Remove Method (Int32) 在这种情况下可以说更直接。但是,很高兴了解String.Remove Method (Int32, Int32),它提供了从源字符串中的任何位置修剪任意长度的子字符串的能力。
    【解决方案5】:

    我一开始就不会添加它:

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

    【讨论】:

    • 我不会说这个 sn-p 的可读性,但我会这样做。
    • 在循环完成后将StringBuilder的长度缩短一也很便宜和容易。
    • +1 用于不添加而不是删除它,用于使用 StringBuilder 而不是 +=,以及用于链接附加而不是连接和附加。 :)
    • 这个解决方案的问题是“if”运算符被调用了“n”次。
    【解决方案6】:
    string str="This is test string.";
    str=str.Remove(str.Length-1);
    

    【讨论】:

    • 来自String.Remove Method (Int32): “返回一个新字符串,其中当前实例中的所有字符,从指定位置开始到最后一个位置,都已被删除。”我>
    【解决方案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()。 +1虽然。帮助了我。
    • @desaivv:不,我正在使用这个重载:public static string Join&lt;T&gt;(string separator, IEnumerable&lt;T&gt; values),它是 C# 4.0 中的新功能 :)
    • 啊,我的错。还在用 VS2008 和 3.0
    【解决方案8】:

    在连接大量字符串时使用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 删除最后一个字符。
    【解决方案9】:
    paramstr.Remove((paramstr.Length-1),1);
    

    这确实可以从字符串末尾删除单个字符。但是如果我用它来删除,比如说,4 个字符,这是行不通的:

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

    作为替代方案,我使用了这种方法:

    DateFrom = DateFrom.Substring(0, DateFrom.Length-4);
    

    【讨论】:

    【解决方案10】:

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

    【讨论】:

      猜你喜欢
      • 2013-10-14
      • 2016-10-11
      • 2011-01-19
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      • 2010-11-08
      • 2021-12-11
      • 2011-11-18
      相关资源
      最近更新 更多