String.Trim () için karakter eklemek (varsayılanları değiştirmek yerine) mümkün mü?

Varsayılan beyaz boşluk karakterleriyle ve ek karakterlerle kırpmak istedim. Ve bunu izleyerek yaptım:

string MyTrim(string source)
{
    char[] badChars = { '!', '?', '#' };
    var result = source.Trim().Trim(badChars);
    return result == source
         ? result
         : MyTrim(result);
}

Bana gelince aptalca görünüyor, çünkü gerekenden daha fazla yinelemeye sahip. String.Trim() için karakter eklemek (varsayılanları değiştirmek yerine) mümkün mü? Veya string.Trim() 'de varsayılan olarak kullanılan' varsayılan boşluk karakterleri 'dizisini nerede bulabilirim? Kulağa hoş geliyor ama bulamıyorum.

6
Neden tekrar tekrar MyTrim 'u çağırıyorsunuz? Ekstra Kırpma araması için endişeleniyorsunuz gibi görünüyor, ancak kendi kodunuz işleri daha da kötüleştiriyor.
katma yazar Dennis, kaynak
Neden tekrar tekrar MyTrim 'u çağırıyorsunuz? Ekstra Kırpma araması için endişeleniyorsunuz gibi görünüyor, ancak kendi kodunuz işleri daha da kötüleştiriyor.
katma yazar Dennis, kaynak
Neden tekrar tekrar MyTrim 'u çağırıyorsunuz? Ekstra Kırpma araması için endişeleniyorsunuz gibi görünüyor, ancak kendi kodunuz işleri daha da kötüleştiriyor.
katma yazar Dennis, kaynak
@ Payse Gerçekten performans sorunu değil, sadece basit bulmaya çalışıyorum.
katma yazar Mirai Mann, kaynak
@Dennis, Üzgünüz, önceki yorum (size bildirildi) yeni mantık uygulaması olmayan ek karakterlerle yapılan çağrı için bitmedi.
katma yazar Mirai Mann, kaynak
@Dennis, Üzgünüz, önceki yorum (size bildirildi) yeni mantık uygulaması olmayan ek karakterlerle yapılan çağrı için bitmedi.
katma yazar Mirai Mann, kaynak
@Dennis, Üzgünüz, önceki yorum (size bildirildi) yeni mantık uygulaması olmayan ek karakterlerle yapılan çağrı için bitmedi.
katma yazar Mirai Mann, kaynak
@Sayse, Üzgünüz, önceki yorum (size bildirildi) yeni mantık uygulaması olmayan ek karakterlerle yapılan çağrı için bitmedi.
katma yazar Mirai Mann, kaynak
@Sayse, Üzgünüz, önceki yorum (size bildirildi) yeni mantık uygulaması olmayan ek karakterlerle yapılan çağrı için bitmedi.
katma yazar Mirai Mann, kaynak
@ Payse Gerçekten performans sorunu değil, sadece basit bulmaya çalışıyorum.
katma yazar Mirai Mann, kaynak
@Dennis, Gerçekten performans sorunu değil, sadece basit bulmaya çalışıyorum.
katma yazar Mirai Mann, kaynak
@ Payse Gerçekten performans sorunu değil, sadece basit bulmaya çalışıyorum.
katma yazar Mirai Mann, kaynak
@Dennis, Gerçekten performans sorunu değil, sadece basit bulmaya çalışıyorum.
katma yazar Mirai Mann, kaynak
@Dennis, Gerçekten performans sorunu değil, sadece basit bulmaya çalışıyorum.
katma yazar Mirai Mann, kaynak
@CodeCaster, oh doğru.
katma yazar Habib, kaynak
@CodeCaster, oh doğru.
katma yazar Habib, kaynak
@CodeCaster, noktayı kaçırdığınızı düşünüyorum, OP birden fazla Trim çağrısını kullanmaktan kaçınmak istiyor.
katma yazar Habib, kaynak
@CodeCaster, noktayı kaçırdığınızı düşünüyorum, OP birden fazla Trim çağrısını kullanmaktan kaçınmak istiyor.
katma yazar Habib, kaynak
@CodeCaster, noktayı kaçırdığınızı düşünüyorum, OP birden fazla Trim çağrısını kullanmaktan kaçınmak istiyor.
katma yazar Habib, kaynak
@CodeCaster, oh doğru.
katma yazar Habib, kaynak
Daha az yineleme elde edeceğinizi sanmıyorum, çünkü iki yerine bir trim çağrısında aynı karakterleri yineleyeceksiniz.
katma yazar Sayse, kaynak
Daha az yineleme elde edeceğinizi sanmıyorum, çünkü iki yerine bir trim çağrısında aynı karakterleri yineleyeceksiniz.
katma yazar Sayse, kaynak
Daha az yineleme elde edeceğinizi sanmıyorum, çünkü iki yerine bir trim çağrısında aynı karakterleri yineleyeceksiniz.
katma yazar Sayse, kaynak
@Habib Yanıtlıyordum "'varsayılan beyaz boşluk karakterleri' dizisini nerede bulabilirim?" .
katma yazar CodeCaster, kaynak
@Habib Yanıtlıyordum "'varsayılan beyaz boşluk karakterleri' dizisini nerede bulabilirim?" .
katma yazar CodeCaster, kaynak
@Habib Yanıtlıyordum "'varsayılan beyaz boşluk karakterleri' dizisini nerede bulabilirim?" .
katma yazar CodeCaster, kaynak
İki regex kullanabilirsiniz: "@ \ A [\ s! #?] *" başlangıç ​​için ve @ "[\ s! #?] * \ Z" sonunda
katma yazar alessio bortolato, kaynak
İki regex kullanabilirsiniz: "@ \ A [\ s! #?] *" başlangıç ​​için ve @ "[\ s! #?] * \ Z" sonunda
katma yazar alessio bortolato, kaynak
İki regex kullanabilirsiniz: "@ \ A [\ s! #?] *" başlangıç ​​için ve @ "[\ s! #?] * \ Z" sonunda
katma yazar alessio bortolato, kaynak

9 cevap

Trim 'in varsayılan davranışını değiştirmenin bir yolu yoktur.

Bununla birlikte, kesmeniz gereken tüm karakterleri içeren bir dizi oluşturmanız gerekebilir, böylece aramaları yalnızca bir aramaya indirgeyebilirsiniz, ancak şöyle bir şey olur:

var badChars =
    (from codepoint in Enumerable.Range(0, 65536)
     let ch = (char)codepoint
     where char.IsWhiteSpace(ch)
           || ch == '!' || ch == '?' || ch == '#'
     select ch).ToArray();

Bu size Trim 'e 1 çağrı yapacak:

var result = source.Trim(badChars);

İdeal olarak, bu badChars 'ı bir yerde saklarsınız, böylece her zaman inşa etmeniz gerekmez.

Şimdi, bu iki çağrıdan daha mı hızlı olacak? Bilmiyorum, ama gerekirse ölçebilirim.

10
katma
Ah, sorudaki kod özyinelemeli, tamam. O zaman ne tavsiye edeceğim konusunda pek emin değilim.
katma yazar Lasse Vågsæther Karl, kaynak
@ LasseV.Karlsen Sadece 2 arama değil, örneğin "a!!!!!!!" - 15. Gerçekten de performans sorunu değil, sadece basit.
katma yazar Mirai Mann, kaynak
@CodeCaster Üzgünüz, ... yeni mantık uygulaması olmadan ek karakterlerle yapılan çağrı için.
katma yazar Mirai Mann, kaynak
@ LasseV.Karlsen Üzgünüz, önceki yorum (size bildirildi) bitmedi ... yeni mantık uygulaması olmadan ek karakterlerle yapılan çağrı için.
katma yazar Mirai Mann, kaynak
Veya OP, beyaz boşluk karakterlerini bulmak için source giriş dizesini yineleyebilir ve ardından 0'dan 65536'ya gitmek yerine bunları kaldırabilir. Performans farkı göz ardı edilebilir olsa da.
katma yazar Habib, kaynak
Erken optimizasyon için ek bir uyarı açığız. Trim (). Trim (ilaveChars) , "aptal" döngüsüne sahip olabilir (OP'nin kelimeleri), bu kodu bazı kod tabanlarında bulmak daha aptal görünecek ve kesinlikle "dakika başına wtfs" skyrocket yapacaktır. Saniyede binlerce ipi kesmiyorsanız, farkı göremezsiniz, bu durumda okunabilirlik daha önemlidir.
katma yazar CodeCaster, kaynak

Trim 'in varsayılan davranışını değiştirmenin bir yolu yoktur.

Bununla birlikte, kesmeniz gereken tüm karakterleri içeren bir dizi oluşturmanız gerekebilir, böylece aramaları yalnızca bir aramaya indirgeyebilirsiniz, ancak şöyle bir şey olur:

var badChars =
    (from codepoint in Enumerable.Range(0, 65536)
     let ch = (char)codepoint
     where char.IsWhiteSpace(ch)
           || ch == '!' || ch == '?' || ch == '#'
     select ch).ToArray();

Bu size Trim 'e 1 çağrı yapacak:

var result = source.Trim(badChars);

İdeal olarak, bu badChars 'ı bir yerde saklarsınız, böylece her zaman inşa etmeniz gerekmez.

Şimdi, bu iki çağrıdan daha mı hızlı olacak? Bilmiyorum, ama gerekirse ölçebilirim.

10
katma
Ah, sorudaki kod özyinelemeli, tamam. O zaman ne tavsiye edeceğim konusunda pek emin değilim.
katma yazar Lasse Vågsæther Karl, kaynak
@ LasseV.Karlsen Sadece 2 arama değil, örneğin "a!!!!!!!" - 15. Gerçekten de performans sorunu değil, sadece basit.
katma yazar Mirai Mann, kaynak
@CodeCaster Üzgünüz, ... yeni mantık uygulaması olmadan ek karakterlerle yapılan çağrı için.
katma yazar Mirai Mann, kaynak
@ LasseV.Karlsen Üzgünüz, önceki yorum (size bildirildi) bitmedi ... yeni mantık uygulaması olmadan ek karakterlerle yapılan çağrı için.
katma yazar Mirai Mann, kaynak
Veya OP, beyaz boşluk karakterlerini bulmak için source giriş dizesini yineleyebilir ve ardından 0'dan 65536'ya gitmek yerine bunları kaldırabilir. Performans farkı göz ardı edilebilir olsa da.
katma yazar Habib, kaynak
Erken optimizasyon için ek bir uyarı açığız. Trim (). Trim (ilaveChars) , "aptal" döngüsüne sahip olabilir (OP'nin kelimeleri), bu kodu bazı kod tabanlarında bulmak daha aptal görünecek ve kesinlikle "dakika başına wtfs" skyrocket yapacaktır. Saniyede binlerce ipi kesmiyorsanız, farkı göremezsiniz, bu durumda okunabilirlik daha önemlidir.
katma yazar CodeCaster, kaynak

Trim 'in varsayılan davranışını değiştirmenin bir yolu yoktur.

Bununla birlikte, kesmeniz gereken tüm karakterleri içeren bir dizi oluşturmanız gerekebilir, böylece aramaları yalnızca bir aramaya indirgeyebilirsiniz, ancak şöyle bir şey olur:

var badChars =
    (from codepoint in Enumerable.Range(0, 65536)
     let ch = (char)codepoint
     where char.IsWhiteSpace(ch)
           || ch == '!' || ch == '?' || ch == '#'
     select ch).ToArray();

Bu size Trim 'e 1 çağrı yapacak:

var result = source.Trim(badChars);

İdeal olarak, bu badChars 'ı bir yerde saklarsınız, böylece her zaman inşa etmeniz gerekmez.

Şimdi, bu iki çağrıdan daha mı hızlı olacak? Bilmiyorum, ama gerekirse ölçebilirim.

10
katma
Ah, sorudaki kod özyinelemeli, tamam. O zaman ne tavsiye edeceğim konusunda pek emin değilim.
katma yazar Lasse Vågsæther Karl, kaynak
@ LasseV.Karlsen Sadece 2 arama değil, örneğin "a!!!!!!!" - 15. Gerçekten de performans sorunu değil, sadece basit.
katma yazar Mirai Mann, kaynak
@CodeCaster Üzgünüz, ... yeni mantık uygulaması olmadan ek karakterlerle yapılan çağrı için.
katma yazar Mirai Mann, kaynak
@ LasseV.Karlsen Üzgünüz, önceki yorum (size bildirildi) bitmedi ... yeni mantık uygulaması olmadan ek karakterlerle yapılan çağrı için.
katma yazar Mirai Mann, kaynak
Veya OP, beyaz boşluk karakterlerini bulmak için source giriş dizesini yineleyebilir ve ardından 0'dan 65536'ya gitmek yerine bunları kaldırabilir. Performans farkı göz ardı edilebilir olsa da.
katma yazar Habib, kaynak
Erken optimizasyon için ek bir uyarı açığız. Trim (). Trim (ilaveChars) , "aptal" döngüsüne sahip olabilir (OP'nin kelimeleri), bu kodu bazı kod tabanlarında bulmak daha aptal görünecek ve kesinlikle "dakika başına wtfs" skyrocket yapacaktır. Saniyede binlerce ipi kesmiyorsanız, farkı göremezsiniz, bu durumda okunabilirlik daha önemlidir.
katma yazar CodeCaster, kaynak

Doğrudan ek karakter eklemek mümkün değildir.

Ancak, boşluk karakterlerinin listesi burada açıklamalarda ve sağlanan tüm numaralardan statik bir yardımcı listesi oluşturabilirsiniz.

Muazzam dizeleri ayrıştırmadıkça, ipte ikinci bir geçiş kaydetme çabalarına değmez.

1
katma

Doğrudan ek karakter eklemek mümkün değildir.

Ancak, boşluk karakterlerinin listesi burada açıklamalarda ve sağlanan tüm numaralardan statik bir yardımcı listesi oluşturabilirsiniz.

Muazzam dizeleri ayrıştırmadıkça, ipte ikinci bir geçiş kaydetme çabalarına değmez.

1
katma

Doğrudan ek karakter eklemek mümkün değildir.

Ancak, boşluk karakterlerinin listesi burada açıklamalarda ve sağlanan tüm numaralardan statik bir yardımcı listesi oluşturabilirsiniz.

Muazzam dizeleri ayrıştırmadıkça, ipte ikinci bir geçiş kaydetme çabalarına değmez.

1
katma
string MyTrim(string source)
{
    if (_badChars == null)
        _badChars = Enumerable
            .Range(0, char.MaxValue)
            .Cast()
            .Where(chr => char.IsWhiteSpace(chr)
                       || chr == '!'
                       || chr == '?'
                       || chr == '#')
            .ToArray();

    return source.Trim(_badChars); 
}
0
katma
string MyTrim(string source)
{
    if (_badChars == null)
        _badChars = Enumerable
            .Range(0, char.MaxValue)
            .Cast()
            .Where(chr => char.IsWhiteSpace(chr)
                       || chr == '!'
                       || chr == '?'
                       || chr == '#')
            .ToArray();

    return source.Trim(_badChars); 
}
0
katma
string MyTrim(string source)
{
    if (_badChars == null)
        _badChars = Enumerable
            .Range(0, char.MaxValue)
            .Cast()
            .Where(chr => char.IsWhiteSpace(chr)
                       || chr == '!'
                       || chr == '?'
                       || chr == '#')
            .ToArray();

    return source.Trim(_badChars); 
}
0
katma