SORU
13 Temmuz 2009, PAZARTESİ


Dize gelen özel karakterleri kaldırmak için en etkili yolu

Bir dize tüm özel karakterleri kaldırmak istiyorum. İzin verilen karakterler A-Z (büyük veya küçük harf), sayılar (0-9), alt çizgi ( _ ) veya nokta işareti (.).

Aşağıdaki sanırım ama işe yarıyor (biliyorum!) çok verimli olmadı

    public static string RemoveSpecialCharacters(string str)
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.Length; i  )
        {
            if ((str[i] >= '0' && str[i] <= '9')
                || (str[i] >= 'A' && str[i] <= 'z'
                    || (str[i] == '.' || str[i] == '_')))
                {
                    sb.Append(str[i]);
                }
        }

        return sb.ToString();
    }

Bunu yapmanın en etkili yolu nedir? Normal bir ifade neye benzerdi ve nasıl normal dize manipülasyon ile kıyaslanabilir?

Temizlenir bu dizeleri oldukça kısa, uzunluğu 10 ila 30 karakter genellikle olacak.

CEVAP
13 Temmuz 2009, PAZARTESİ


Neden senin yöntem pek etkili olduğunu düşünüyor musunuz? Aslında yapabileceğiniz en etkili yollarından biri.

Tabii ki yerel bir değişken karakter okuma ya da bir kaptan dizi erişim sayısını azaltmak için kullanmanız gerekir:

public static string RemoveSpecialCharacters(string str) {
   StringBuilder sb = new StringBuilder();
   foreach (char c in str) {
      if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '.' || c == '_') {
         sb.Append(c);
      }
   }
   return sb.ToString();
}

Böyle bir yöntemi etkili kılan tek şey iyi ölçekler. Yürütme zamanı dize uzunluğuna göre olacak. Eğer büyük bir dize kullanmak istiyorsanız kötü sürprizler yok.

Düzenleme:
Hızlı performans testi, 24 karakter bir dize ile milyonlarca kez her bir fonksiyonun çalışması yaptım. Bu sonuçlar şunlardır:

Orjinal işlevi: 54.5 ms.
Benim önerilen değişiklik: ms 47.1.
Ayar StringBuilder kapasiteli maden: ms 43.3.
Düzenli ifade: 294.4 ms.

Edit 2: A-Z ve a-z kodu yukarıda ayrımı ekledim. (Performans testi ... defalarca kontrol ettim ve fark fark yoktur.)

Edit 3:
Arama char denedim[] çözümü, ve yaklaşık 13 ms çalışır.

Bedeli ise, tabii ki, büyük bir arama tablosu ve hafızada tutma başlatma. O kadar veri yok, ama böyle önemsiz bir işlev için çok fazla

private static bool[] _lookup;

static Program() {
   _lookup = new bool[65536];
   for (char c = '0'; c <= '9'; c  ) _lookup[c] = true;
   for (char c = 'A'; c <= 'Z'; c  ) _lookup[c] = true;
   for (char c = 'a'; c <= 'z'; c  ) _lookup[c] = true;
   _lookup['.'] = true;
   _lookup['_'] = true;
}

public static string RemoveSpecialCharacters(string str) {
   char[] buffer = new char[str.Length];
   int index = 0;
   foreach (char c in str) {
      if (_lookup[c]) {
         buffer[index] = c;
         index  ;
      }
   }
   return new string(buffer, 0, index);
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BioHunta

    BioHunta

    28 Mayıs 2006
  • Caina Mondo Zine

    Caina Mondo

    13 EKİM 2007
  • kylelandry

    kylelandry

    9 AĞUSTOS 2007