2011-02-08 15 views
5

Aşağıdaki durumlarda herhangi bir durumda olabilecek bazı dizeleri denetlemem ve sonra bunları kaldırmam gereken bir yöntem var. Sadece daha iyi bir performans yolu olup olmadığını merak ettiniz mi? Ben yenmek zor olacak hayal C++ uygulanan yönetilmeyen kodaMerak etme - Bu dizgenin yerine geçmek için daha iyi bir yaklaşım var mı?

private void MyMethod(string Filter) 
{ 
    //need to remove <Filter> and </Filter> case in-sensitive 
    var result = Filter.ToLower().Replace("<filter>",""); 
    result = Filter.ToLower().Replace("</filter>,""); 

    ........................... 
} 
+1

'Regex.Replace (Filtre, "", string.Empty, RegexOptions.IgnoreCase); 'Çeşitli yöntemlerin performansıyla ilgileniyorsanız, burada SO hakkında çok sayıda tartışma var. –

+3

, etiketler arasındaki neyin durumunu değiştirmeyecektir. ya da sizin için önemli değil. –

+3

'ToUpper', ToLower'dan daha iyi bir seçenektir. Dize karşılaştırma ve değiştirme, eski için optimize edildi. Geliştiricinin bakış açısından, hiçbir fark yoktur, bu yüzden basit bir düzeltme. –

cevap

3

ilgili bir problem, küçük harf içine bütün dizeyi çevirmek sadece bir vaka insensetive yerini yapmaz olmasıdır.

Bir vaka insensetive maçı yapmak için normal bir ifade kullanabilirsiniz:

diğer alternatif bir vaka insensetive arama yapabilirsiniz gibi dizeleri bulmak için IndexOf yöntemini kullanmaktır
string result = Regex.Replace(
    Filter, 
    "</?filter>", 
    String.Empty, 
    RegexOptions.IgnoreCase 
); 

:

string result = Filter; 
int index; 
while ((index = IndexOf("<filter>", StringComparison.OrdinalIgnoreCase)) != -1) { 
    result = result.Remove(index, 8); 
} 
while ((index = IndexOf("</filter>", StringComparison.OrdinalIgnoreCase)) != -1) { 
    result = result.Remove(index, 9); 
} 
1

Replace çağırır.

Ancak, ben size bir çağrıda aşağı kesebilir hangi .ToLower() kullanarak ve dize tutarak tutmak görebilirsiniz.

+0

ToLower() öğelerinin bir sorun olabileceğini düşünüyorum. Ayrıca, çıkış dizesi şimdi küçük harfli. –

+0

Evet, sadece kelimeleri yazıyordum :) – Aliostad

+0

Ben bu (yönetilmeyen kod bit) çok şüphem var. –

4

Kontrol Bu cevap: Is there an alternative to string.Replace that is case-insensitive?

Bir performans çek ile bir karşılaştırma yapmak isteyebilirsiniz. Bunu bir profilerle paylaş. Gerçekten bilmenin tek yolu, daha hızlı olan şey.

Ama dürüst: Performans gerçekten önemli mi? Bunu ne sıklıkla yapıyorsun? Gerçekten duyarsız bir durumda yerine sahip,

Sen Regex.Replace deneyebiliriz ... bu performans sorunu haline gelecek kadar sık ​​bunu göremez. Bu daha hızlı değil. Ama bu durumda duyarsız. Her durumda

+0

Neden bir düzenli ifadenin daha hızlı olacağını düşünüyorsunuz? Ve değilse, bunun yerine neden bunu denemenizi öneriyorsunuz? –

+0

"Regex.Replace" ın daha hızlı, tam tersi olduğunu iddia ettiğini sanmıyorum. –

+0

Hayır, Regex.Replace'ın daha hızlı olduğunu sanmıyorum. Ama bir durum duyarsız yerine geçer. Cevabımı güncelleyeceğim. –

1

, hangi iyi bir şey olmayabilir, alt Kılıf buraya orijinal dize vardır?

+0

Koddaki yorumlar, niyetin büyük/küçük harf duyarlı olmayan bir yerine koyma olduğunu gösterir. Sanırım bu yüzden dize küçük harfe dönüştürülüyor. –

+1

@Cody Gray - Bu doğru, fakat burada sorun, dizenin değiştirilmeyen kısmı, aynı zamanda tüm küçük harflere de dönüştü. Bence bjornarlar burada endişeleniyor. (Bu aslında bir yanıttan daha fazla bir yorum olsa bile) –

0

bu hızlı olacaktır daha sağlanan kod, sizin için çalışıyorsa:

private void MyMethod(string Filter) 
{ 
    //need to remove <Filter> and </Filter> case in-sensitive 
    var result = Filter.ToLower().Replace("</filter>",""); 

    ........................... 
} 

ilk ifadesinin sonuç hale gelmesi sonucu. Bu yaklaşımla

+0

Kapanış bir çift alıntı eksik. Ayrıca, bu aynı sonucu üretmiyor. Sadece adımlardan birini kaldırır. Esasen, kodunuz yukarıdaki yorumun yaptığı şeyi yapmıyor. – David

+0

Doğru, ancak sağlanan kodla aynı şeyi yapıyor, ancak her iki yerine de "Filter.ToLower()" yapılır. – Excel20

+0

Bunu yapmak için zor bir zaman geçiriyorum. Yapmamalı ve yapmamalıyım. Ama sen beni güldürdün :) –

1

O
Yani ölçmek zorunda kalacak Filtre dizesi ne kadar süre bir kaç şey, vs. bağlıdır.

Fakat burada bir tane daha beklerdim.

+0

Bir sebepten dolayı burada değiştirilecek 50 diziniz varsa. RegEx inanılmaz dağınıklık kazandı mı? –

+0

@Oyvind: Çok hızlı olur, daha iyi olur. –

+0

Hıza bakmıyordum, ancak kodun okunabilirliği. Bunu daha iyi görebilmek için herhangi bir yol var mı? (Şu anda RegEx yapmıyorum, bu yüzden soruyorum;)) –

İlgili konular