2013-05-07 35 views
9

Điều này rất kỳ lạ vì tôi đã sử dụng hàm Thay thế cho hàng nghìn lần. Đây là mã của tôi:String.Đặt lại không hoạt động chính xác

while (d.IndexOf("--") != -1) d=d.Replace("--", "-"); 

và đây là biến d 's giá trị khi tôi theo dõi:

"آدنیس,اسم دختر,girl name,آدونیس--‌-گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود" 

nhưng nó bị mắc kẹt khi giá trị của d là:

"آدنیس,اسم دختر,girl name,آدونیس-‌-گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود" 

ai cũng có thể cho tôi biết lý do tại sao? Buồn cười của nó mà ngay cả dấu gạch ngang cũng được thêm vào theo chương trình.

+0

xin lỗi - Tôi không hiểu tại sao bạn nghĩ rằng đây không phải là hoạt động chính xác - bạn có thể giải thích hơn? 'nó bị mắc kẹt' có nghĩa là gì? – Stuart

+0

@Stuart Thay thế là trong một vòng lặp nhưng kết quả chứa hai minuses mà không được thay thế. – flup

+0

có chính xác, tại sao? –

Trả lời

19

Đó là bởi vì này:

var d1 = "آدنیس,اسم دختر,girl name,آدونیس--‌-گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود"; 

không giống như thế này:

var d2 = "آدنیس,اسم دختر,girl name,آدونیس---گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود"; 

Hai ba ký tự cuối cùng trong chuỗi của bạn không thực sự là unicode - Hãy thử nó cho mình:

var d1 = "آدنیس,اسم دختر,girl name,آدونیس--‌-گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود"; 
var d2 = "آدنیس,اسم دختر,girl name,آدونیس---گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود"; 
while (d.IndexOf("--", StringComparison.Ordinal) != -1) d1 = d1.Replace("--", "-"); 
Console.WriteLine(d1); // the last characters are left 
while (d2.IndexOf("--", StringComparison.Ordinal) != -1) d2 = d2.Replace("--", "-"); 
Console.WriteLine(d2); // All clear 

Just FYI: Chuỗi phương pháp so sánh indexOf là văn hóa cụ thể. Tôi sẽ sử dụng:

var d = "آدنیس,اسم دختر,girl name,آدونیس--‌-گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود"; 
while (d.IndexOf("--", System.StringComparison.Ordinal) != -1) 
     d = d.Replace("--", "-"); 

Vì nó sử dụng các quy tắc thứ tự, tức là các giá trị unicode độc ​​lập văn hóa và nó chạy nhanh hơn.

+1

+1 hoàn hảo ...... – Habib

+0

greattttttt, tôi đã sử dụng indexOf rất nhiều nhưng chưa bao giờ gặp vấn đề này. Cảm ơn rất nhiều –

+0

tôi đã thử mã này nhưng có vẻ như nó không hoạt động trong trình biên dịch của tôi, tôi đang thiếu gì? http://i.stack.imgur.com/jxswx.jpg –

4

Bạn có thể sử dụng Regex.Replace()

string _txt = "----------"; 
_txt = Regex.Replace(_txt, @"\-{2,}", "-"); 

chí đầu ra này: -

+0

cảm ơn rất nhiều điều này giải quyết vấn đề của tôi nhưng tôi thực sự bối rối bạn có thể cho tôi biết vấn đề với thay thế là gì? –

+1

'replace' hoặc' regex.replace'? –

+1

Tại sao mã trong câu hỏi không thành công? Am tò mò quá bây giờ. – flup

3

Tôi đã thử nghiệm điều này với LinqPad - thú vị.

// d0 succeeds: 
var d0 = "world--life"; 

while (d0.IndexOf("--") != -1) 
{ 
    d0=d0.Replace("--", "-"); 
    d0.Dump(); 
} 

// d1 loops forever 
var d1 = "world--life"; 

while (d1.IndexOf("--") != -1) 
{ 
    d1=d1.Replace("-‌-", "-"); 
    d1.Dump(); 
} 

Sự khác biệt giữa hai vòng là trong khi họ có thể xuất hiện giống hệt nhau, vòng thứ hai thực sự sử dụng các ký tự Unicode khác nhau cho các dấu gạch nối trong IndexOf đến những người thân trong Replace

Nhìn vào các tài liệu MSDN:

Vì vậy, sự khác biệt là văn hóa-insensitive so văn hóa nhạy cảm

+0

Tôi nhận được câu trả lời, thật thú vị. có một cái nhìn vào nó. –

+0

tôi đã không phát hiện ra sự khác biệt giữa hai vòng –

+0

Đã cập nhật - nghĩ rằng câu trả lời được giải quyết ... – Stuart

Các vấn đề liên quan