Xóa char cuối cùng của chuỗi


259

Tôi đang lấy rất nhiều thông tin trong một danh sách, được liên kết với cơ sở dữ liệu và tôi muốn tạo một chuỗi các nhóm, cho một người nào đó được kết nối với trang web.

Tôi sử dụng điều này để kiểm tra nhưng điều này không năng động, vì vậy nó thực sự tồi tệ:

string strgroupids = "6";

Tôi muốn sử dụng nó bây giờ. Nhưng chuỗi trả về là một cái gì đó như1,2,3,4,5,

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

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

Tôi muốn xóa ,sau 5nhưng nó chắc chắn không hoạt động.


9
Giải pháp cho vấn đề trực tiếp là strgroupids = strgroupids.TrimEnd(new char[] { ',' });nhưng có những ý tưởng tốt hơn dưới đây.
Henk Holterman

Câu trả lời:


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

MSDN:

Chuỗi.Remove (Int32):

Xóa tất cả các ký tự khỏi chuỗi này bắt đầu tại một vị trí đã chỉ định và tiếp tục qua vị trí cuối cùng


1
Hoàn hảo để loại bỏ char cuối cùng nếu bạn muốn loại bỏ char cuối cùng. Đối với câu hỏi của OP, vấn đề không nên tồn tại nếu bạn không tạo char charing. Kiểm tra @ Øyvind giải pháp Bråthen nếu bạn đang ở trên thuyền của OP.
aloisdg chuyển đến codidact.com

86

Làm gì theo cách này

strgroupids = string.Join( ",", groupIds );

Một rất nhiều bụi.

Nó sẽ nối tất cả các yếu tố bên trong groupIdsvới một ','giữa, nhưng nó sẽ không đặt ','cuối cùng.


4
Chỉ trong C # 4.0. Trong C # 3.5, bạn sẽ phải chuyển đổi groupIds thành mảng.
xanatos

3
Điều này sẽ khắc phục vấn đề OP.
aloisdg chuyển đến codidact.com

29

Chuỗi trong c # là bất biến. Khi trong mã của bạn, bạn làm strgroupids.TrimEnd(',');hoặc strgroupids.TrimEnd(new char[] { ',' });các strgroupidschuỗi không được sửa đổi .

Bạn cần phải làm một cái gì đó như strgroupids = strgroupids.TrimEnd(',');thay vào đó.

Để trích dẫn từ đây :

Chuỗi là bất biến - nội dung của một đối tượng chuỗi không thể thay đổi sau khi đối tượng được tạo, mặc dù cú pháp làm cho nó xuất hiện như thể bạn có thể làm điều này. Ví dụ, khi bạn viết mã này, trình biên dịch thực sự tạo ra một đối tượng chuỗi mới để giữ chuỗi ký tự mới và đối tượng mới đó được gán cho b. Chuỗi "h" sau đó đủ điều kiện để thu gom rác.


11

Thêm một phương thức mở rộng.

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

sau đó sử dụng:

yourString.RemoveLast(",");

Ý tưởng cơ bản của việc tạo ra một phương thức mở rộng là tốt. Tuy nhiên, IMHO, phương pháp được triển khai ở đây là quá mức cần thiết cho việc sử dụng này. OP biết nhân vật mà anh ta muốn ở cuối chuỗi, vì vậy không có lý do gì để phải trả chi phí cho việc tìm kiếm chuỗi đó, thông qua LastIndexOf. Chỉ cần đưa ra câu trả lời được chấp nhận, và làm cho nó một phương pháp mở rộng. Hoặc khái quát câu trả lời đó, bằng cách chuyển vào int n, số lượng ký tự cần loại bỏ ở cuối. Thứ hai, bạn kiểm tra độ dài bằng không, nhưng điều đó không loại bỏ tất cả các ngoại lệ có thể xảy ra. Sẽ tốt hơn để làm int index = ..LastIndexOf.., sau đó if (index >= 0).
ToolmakerSteve

Thứ ba, tham số string characterđược đặt tên kém. Thứ tư, các lập trình viên trong tương lai không rõ ràng rằng việc này sẽ loại bỏ các ký tự ở cuối chuỗi. Oh chờ đợi, nó không nhất thiết phải làm như vậy. Nó đang tìm kiếm chuỗi. Nó có thể được loại bỏ từ một nơi nào đó ở giữa. Bây giờ lập trình viên bảo trì phải kiểm tra tất cả các sử dụng của phương thức, để xem những gì đã cố gắng để được hoàn thành. Không phải là một phương pháp tốt để gọi, vì nhu cầu đơn giản này là loại bỏ từ cuối chuỗi. Xin lỗi vì tất cả những lời chỉ trích; Tôi làm như vậy cho bất cứ ai áp dụng phương pháp này, để họ hiểu.
ToolmakerSteve

Thứ năm, trong bối cảnh của câu hỏi, String.TrimEndsẽ thích hợp hơn để sử dụng. Nhưng chờ đã, điều đó đã tồn tại - và đã được đề cập trong câu hỏi ban đầu và một số câu trả lời khác 3 năm trước - không cần phải phát minh ra một phương pháp mới! Lợi ích của phương pháp của bạn là gì?
ToolmakerSteve

7

Xóa mọi dấu phẩy:

while (strgroupids.EndsWith(","))
    strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);

Điều này là ngược, mặc dù, bạn đã viết mã thêm dấu phẩy ở vị trí đầu tiên. Bạn nên sử dụng string.Join(",",g)thay thế, giả sử glà a string[]. Đặt cho nó một cái tên tốt hơn gquá!


4

Thay thế cho việc thêm dấu phẩy cho mỗi mục, bạn chỉ có thể sử dụng String.Join:

var strgroupids = String.Join(",",  groupIds);

Điều này sẽ thêm seperator ("," trong trường hợp này) giữa mỗi phần tử trong mảng.


3
string strgroupids = string.Empty;

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

strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);

Lưu ý rằng việc sử dụng ForEachở đây thường được coi là "sai" (đọc ví dụ http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx )

Sử dụng một số LINQ:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => p + q + ',');
strgroupids = strgroupids.Substring(0, str1.Length - 1);

Không có lớp nền cuối:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => (p != string.Empty ? p + "," + q : q.ToString()));

1
@KierenJohnstone string.Joinhoàn hảo NẾU bạn có một chuỗi các chuỗi làm nguồn HOẶC bạn có C # 4.0
xanatos

3

Bổ sung cho giải pháp của sll: Tốt hơn là cắt chuỗi trong trường hợp có một số trống ở cuối.

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

2

string.Joinlà tốt hơn, nhưng nếu bạn thực sự muốn có một LINQ ForEach:

var strgroupids = string.Empty;

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

    strgroupids += g;
});

Một số lưu ý:

  • string.Joinforeachcả hai đều tốt hơn thế này, cách tiếp cận chậm hơn rất nhiều
  • Không cần phải xóa cái cuối cùng ,vì nó không bao giờ được thêm vào
  • Toán tử gia tăng ( +=) thuận tiện cho việc nối vào chuỗi
  • .ToString() là không cần thiết vì nó được gọi tự động khi nối các chuỗi không
  • Khi xử lý các chuỗi lớn, StringBuildernên xem xét thay vì nối các chuỗi

1
BUG - cần đảo ngược bài kiểm tra if - nên làif(strgroupids != string.Empty){
ToolmakerSteve

Nhưng cảm ơn bạn đã thêm một câu trả lời cho thấy cách sử dụng for-every để xây dựng chuỗi mà không có "," không mong muốn! Lưu ý rằng không cần thiết phải làm lambda và ForEach; foreach (var g in groupIds) {cũng hoạt động tốt :)
ToolmakerSteve

n1 @ToolmakerSteve, về LINQ thì đó là mã OP tôi đã lấy
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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.