2016-04-04 16 views
1

Buna benzer bir çok başvuru buldum, ancak hiçbiri tam olarak neye benzediğimi göstermiyor, dolayısıyla birinin yardım edebileceğini umarak.
Basit bir şekilde, bir kullanıcı tarafından girilen (Winform girişine) bir dize almak ve önce herhangi bir boşluğu kesmek istiyorum, daha sonra 'yasadışı' karakterlerin herhangi birini Birleşik Krallık para birimi simgesiyle (£) değiştirin. Gereksinim, kullanılacak girdiye yöneliktir, ancak işlem tarafından oluşturulan dosyanın değiştirilmiş dosya adı vardır.
I (bir uzantısı yöntemine dayalı) bir fonksiyon yazdım ama beklendiği gibi oldukça çalışmıyor: C# bir karakter seçiminin her örneğini bir dizgede değiştirin

public static class ExtensionMethods 
    { 
     public static string Replace(this string s, char[] separators, string newVal) 
     { 
      var temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries); 
      return String.Join(newVal, temp); 
     } 
    } 

public static string RemoveUnwantedChars(string enteredName, char[] unwanted, string rChar) 
    { 
     return enteredName.Replace(unwanted, rChar); 
    } 

benim kodunda, iki kez aradım Hangi:

char[] blank = { ' ' }; 
string ename = Utilities.RemoveUnwantedChars(this.txtTableName.Text, blank, string.Empty); 

char[] unwanted = { '(', ')', '.', '%', '/', '&', '+' }; 
string fname = Utilities.RemoveUnwantedChars(ename, unwanted, "£"); 

Ben girerseniz En az bir boşluk, yukarıdaki tüm karakterler ve diğer bazı harfler (örneğin, "(GH) F16.5% MX/Y & 1 + 1") içeren dize aşağıdaki sonuçları alır:
ename = " (GH) F16.5% MX/Y & 1 + 1 "- Bu doğru olduğundan boşlukları.
fname = "GH £ F16 £ 5 £ MX £ Y £ 1 £ 1" - Bu, ilk karakteri değiştirmediği, ancak kaldırdığı için düzgün çalışmadı.
Karakterlerin geri kalanı doğru şekilde değiştirildi. Yalnızca 'illegal' karakterlerden biri dizenin başında olduğunda oluşur - dizgem "G (H) F16.5% MX/Y & 1 + 1" ise, doğru şekilde "G £ H £" alırdım F16 £ 5 £ MX £ Y £ 1 £ 1" . Aynı zamanda birden fazla 'yasa dışı' karakteri bir '£' ile değiştirir, dolayısıyla "M() GX + .1", "M £ GX £ 1" olur, ancak "M ££ GX £ 1" olmalıdır.

cevap

3

Sorunun, Replace uzantınızdaki olduğunu düşünüyorum. Bu satırda ayrılıyorsunuz. Beklenmeyen sonucu veren boş girdileri siliyorsunuz. Bunu kullan:

var temp = s.Split(separators, StringSplitOptions.None); 
+0

https://dotnetfiddle.net/qjrgcc:

Olası bir çözüm string.Join() kullanmaktan kaçının ve bunun yerine böyle Replace() yazmaktır – alextansc

0

aşağıdaki konularda içinde bölünmüş yöntemi kullandığınızda aşağıdaki dizeleri olsun işlevini değiştir: GH, F16, 5, MX, Y, 1, 1. sizin olsun sizin newVal onları katıldığınızda : GH + newVal + F16 + newVal + ... bu nedenle ilk değiştirilen karakteri atlamamaktadır.

İlk char'ın "illegal" olup olmadığını kontrol etmek ve dizininizin başına newVal koymak için muhtemelen bazı özel durumlara ihtiyacınız olacaktır.

2

Sorun, string.Join() yalnızcaarasındakiarasındaki ayırıcıları ayırdığı için oluşuyor.

public static class ExtensionMethods 
{ 
    public static string Replace(this string s, char[] separators, string newVal) 
    { 
     var sb = new StringBuilder(s); 

     foreach (char ch in separators) 
     { 
      string target = new string(ch, 1); 
      sb.Replace(target, newVal); 
     } 

     return sb.ToString(); 
    } 
} 
İlgili konular