Làm cách nào để xóa ký tự cuối cùng trong một chuỗi trong C #?


94

Xây dựng một chuỗi cho yêu cầu đăng bài theo cách sau,

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

sau khi tôi nhận được kết quả paramstr, tôi cần xóa ký tự cuối cùng &trong đó

Làm cách nào để xóa ký tự cuối cùng trong một chuỗi bằng C #?


2
Đoán nó tốt hơn để chỉ không thêm nó ở nơi đầu tiên, nhưng nếu không bạn có thể thử paramstr.Substring (0, paramstr.Length - 1)
— Jaco Pretorius

Trong trường hợp prodID của bạn được phép chứa các ký tự tùy ý, đặc biệt &, bạn cần đảm bảo rằng nó được thoát đúng cách, chẳng hạn như câu trả lời của @MarcGravell.
— Eugene Beresovsky

Câu trả lời:


75

string.Jointhay vào đó xây dựng nó bằng :

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

string.Joinnhận một seperator ( "&") và và mảng chuỗi ( parameters), và chèn trình phân tách giữa mỗi phần tử của mảng.


1
Cần lưu ý rằng điều này rất hữu ích nếu bạn không muốn có dấu & ở cuối chuỗi.
— Ammar

Tôi biết điều này là trong Ruby, không biết nó là trong C # và tôi là một nhà phát triển .net. Tôi cảm thấy lol rất bối rối
— Jack Marchetti

Tôi không thể tin rằng đây là câu trả lời được chọn ... câu trả lời ngay dưới đây của @BrianRasmussen đơn giản hơn nhiều.
— FastTrack

@FastTrack Nó đã giải quyết được vấn đề gốc rễ, thay vì trả lời câu hỏi trong tiêu đề. Khiếu nại của tôi: nếu bạn sắp trôi chảy, tại sao không chỉ làm tất cả trong một dòng.
— Graham,

241

Cá nhân tôi sẽ đồng ý với đề xuất của Rob, nhưng nếu bạn muốn xóa một (hoặc nhiều) ký tự theo sau cụ thể, bạn có thể sử dụng TrimEnd. Ví dụ

paramstr = paramstr.TrimEnd('&');

15
Lưu ý rằng TrimEnd sẽ xóa tất cả các lần xuất hiện ở cuối của ký tự '&' ... đó, vì vậy nếu chuỗi kết thúc bằng '&&&' thì TrimEnd sẽ xóa cả 3 trong số đó '&', không chỉ dấu cuối cùng. Đó có thể là điều mà OP mong muốn.
— Doug S

3
@DougS FWIW Tôi đã viết "xóa một (hoặc nhiều)".
— Brian Rasmussen

+1 cho một giải pháp đơn giản, do đó có thể dễ dàng được sử dụng như một thành phần cho các vấn đề khác. Tôi đang tìm kiếm giải pháp để tạo đường dẫn từ nhiều phần đảm bảo không có dấu gạch chéo kép hoặc thiếu. Kết hợp TrimEnd và TrimStart với kỹ thuật này đảm bảo điều này.
— Joeppie

1
@Joeppie: đề xuất sử dụng Path.Combine, hiểu tất cả các dấu phân cách đường dẫn. Ít nhất sử dụng Trimmà bắt đầu và kết thúc trong một lần.
— Nigel Touch

@Nigel rắc rối mà tôi gặp phải với Path.Combine là nếu đối số thứ hai bắt đầu bằng dấu gạch chéo, nó được hiểu là một đường dẫn tuyệt đối và kết quả là đường dẫn tuyệt đối; đây là thứ mà tôi muốn 'cứu' những người gọi mã của tôi. Tuy nhiên, điểm tốt trên Trim :)
— Joeppie

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

15

Thử cái này:

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

2
Bạn có cân nhắc giải thích câu trả lời của mình một chút để những người khác đi cùng hiểu rõ hơn tại sao bạn đề xuất câu trả lời đó không?
— Andrew Barber

1
Câu trả lời của @Altaf Patel sử dụng phương thức anh em String.Remove Method (Int32) được cho là đơn giản hơn trong tình huống này. Tuy nhiên, điều cần biết về Phương thức String.Remove (Int32, Int32) cung cấp khả năng cắt một chuỗi con có độ dài tùy ý từ bất kỳ đâu trong chuỗi nguồn.
— DavidRR

13

Tôi sẽ không thêm nó ngay từ đầu:

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

Tôi sẽ không nói bất cứ điều gì về khả năng đọc của đoạn mã này, nhưng đây là cách tôi muốn làm.
— Matti Virkkunen

2
Nó cũng rẻ và dễ dàng chỉ cần rút ngắn độ dài của StringBuilder một sau khi vòng lặp được thực hiện.
— Matt Greer

+1 vì không thêm nó thay vì xóa nó, để sử dụng StringBuilder thay vì + = và để nối chuỗi thay vì nối và nối. :)
— Guffa

1
Vấn đề với giải pháp này là toán tử "if" được gọi là "n" lần.
— magallanes 23/12/12

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

1
Từ Phương thức String.Remove (Int32) : "Trả về một chuỗi mới, trong đó tất cả các ký tự trong phiên bản hiện tại, bắt đầu từ một vị trí được chỉ định và tiếp tục đến vị trí cuối cùng, đã bị xóa."
— DavidRR

7

Sẽ tốt hơn nếu bạn sử dụng 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);
 }

Bạn đang thiếu .ToArray()trong Jointuyên bố của bạn . +1 mặc dù. Đã giúp tôi.
— desaivv

1
@desaivv: Không, tôi đang sử dụng quá tải này : public static string Join<T>(string separator, IEnumerable<T> values), nó mới trong C # 4.0 :)
— Cheng Chen

Ahh xấu của tôi. Vẫn sử dụng VS2008 với 3.0
— desaivv Ngày

5

Thực hành tốt là sử dụng a StringBuilderkhi nối nhiều chuỗi và sau đó bạn có thể sử dụng phương thức Xóa để loại bỏ ký tự cuối cùng.

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

Tôi cũng nhớ rằng bạn cũng có thể sử dụng paramBuilder.Length - 1để xóa ký tự cuối cùng.
— Dan Diplo

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

Điều này hoạt động để xóa một ký tự duy nhất khỏi cuối chuỗi. Nhưng nếu tôi sử dụng nó để xóa 4 ký tự, điều này không hoạt động:

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

Thay vào đó, tôi đã sử dụng phương pháp này để thay thế:

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

2
Sử dụng String.Remove Method (Int32, Int32) , để loại bỏ 4 ký tự từ ngày kết thúc của một chuỗi: result = source.Remove((source.Length - 4), 4);.
— DavidRR

0

Thêm một 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;
}

sau đó sử dụng:

yourStringBuilder.RemoveLast(",");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.