Bagaimana cara memperluas tipe bawaan C #, seperti String?

91

Salam semuanya ... Saya perlu Trima String. Tapi saya ingin menghapus semua ruang kosong yang berulang di dalam String itu sendiri, tidak hanya di akhir atau di awal. Saya bisa melakukannya dengan metode seperti:

public static string ConvertWhitespacesToSingleSpaces(string value)
{
    value = Regex.Replace(value, @"\s+", " ");
}

Yang saya dapatkan dari sini . Tapi saya ingin potongan kode ini dipanggil di dalam String.Trim()dirinya sendiri, jadi saya pikir saya perlu memperpanjang atau membebani atau mengganti Trimmetode ... Apakah ada cara untuk melakukan itu?

Terima kasih sebelumnya.

Girardi
sumber

Jawaban:

166

Karena Anda tidak bisa memperpanjang string.Trim(). Anda dapat membuat metode Ekstensi seperti yang dijelaskan di sini yang memangkas dan mengurangi ruang kosong.

namespace CustomExtensions
{
    //Extension methods must be defined in a static class
    public static class StringExtension
    {
        // This is the extension method.
        // The first parameter takes the "this" modifier
        // and specifies the type for which the method is defined.
        public static string TrimAndReduce(this string str)
        {
            return ConvertWhitespacesToSingleSpaces(str).Trim();
        }

        public static string ConvertWhitespacesToSingleSpaces(this string value)
        {
            return Regex.Replace(value, @"\s+", " ");
        }
    }
}

Anda bisa menggunakannya seperti itu

using CustomExtensions;

string text = "  I'm    wearing the   cheese.  It isn't wearing me!   ";
text = text.TrimAndReduce();

Memberi anda

text = "I'm wearing the cheese. It isn't wearing me!";
JoeyRobichaud
sumber
Apakah file membutuhkan nama khusus? Atau di mana Anda menyimpan ini? Bisakah itu dimasukkan ke dalam kelas Util atau semacamnya?
menguji
1
@testing Anda dapat meletakkannya di mana saja selama mereka direferensikan ke dalam proyek Anda. Jika Anda meletakkannya di namespace tertentu, cukup masukkan dengan pernyataan 'using' seperti kelas lainnya.
Dua kali
mengapa Anda tidak mengembalikan regex langsung dari fungsi TrimAndReduce? itu akan membuat jawaban Anda lebih mudah dibaca. Kecuali Anda menggunakan jawaban Anda begitu banyak sehingga Anda perlu menyebutnya di tempat lain LOL
quemeful
24

Apa itu mungkin? Ya, tetapi hanya dengan metode ekstensi

Kelas System.Stringdisegel sehingga Anda tidak dapat menggunakan penggantian atau warisan.

public static class MyStringExtensions
{
  public static string ConvertWhitespacesToSingleSpaces(this string value)
  {
    return Regex.Replace(value, @"\s+", " ");
  }
}

// usage: 
string s = "test   !";
s = s.ConvertWhitespacesToSingleSpaces();
Henk Holterman
sumber
5
Untuk memperjelas, tidak, tidak mungkin mengubah tindakan yang String.Trimdiambil.
Michael Petrotta
10

Ada ya dan tidak untuk pertanyaan Anda.

Ya, Anda dapat memperluas tipe yang sudah ada dengan menggunakan metode ekstensi. Metode ekstensi, secara alami, hanya dapat mengakses antarmuka publik dari jenis tersebut.

public static string ConvertWhitespacesToSingleSpaces(this string value) {...}

// some time later...
"hello world".ConvertWhitespacesToSingleSpaces()

Tidak, Anda tidak dapat memanggil metode ini Trim(). Metode ekstensi tidak berpartisipasi dalam overloading. Saya pikir seorang kompilator bahkan harus memberi Anda pesan kesalahan yang merinci ini.

Metode ekstensi hanya terlihat jika namespace berisi tipe yang mendefinisikan metode tersebut sedang digunakan.

Arne
sumber
7

Metode penyuluhan!

public static class MyExtensions
{
    public static string ConvertWhitespacesToSingleSpaces(this string value)
    {
        return Regex.Replace(value, @"\s+", " ");
    }
}
Corey Sunwold
sumber
2

Selain menggunakan metode ekstensi - kemungkinan merupakan kandidat yang baik di sini - dimungkinkan juga untuk "membungkus" sebuah objek (misalnya "komposisi objek"). Selama formulir yang dibungkus tidak berisi lebih banyak informasi daripada hal yang dibungkus, maka item yang dibungkus dapat diteruskan dengan rapi melalui konversi implisit atau eksplisit tanpa kehilangan informasi: hanya perubahan jenis / antarmuka.

Selamat membuat kode.


sumber