Saya menelepon API REST dan menerima kembali respons XML. Ini mengembalikan daftar nama ruang kerja, dan saya sedang menulis IsExistingWorkspace()
metode cepat . Karena semua ruang kerja terdiri dari karakter yang berdekatan tanpa spasi, saya mengasumsikan cara termudah untuk mengetahui apakah ruang kerja tertentu ada dalam daftar adalah dengan menghapus semua spasi putih (termasuk baris baru) dan melakukan ini (XML adalah string yang diterima dari web permintaan):
XML.Contains("<name>" + workspaceName + "</name>");
Saya tahu ini peka huruf besar-kecil, dan saya mengandalkan itu. Saya hanya perlu cara untuk menghapus semua spasi putih dalam string secara efisien. Saya tahu RegEx dan LINQ dapat melakukannya, tetapi saya terbuka untuk ide-ide lain. Saya kebanyakan hanya khawatir tentang kecepatan.
sumber
Jawaban:
Ini adalah cara tercepat yang saya tahu, meskipun Anda mengatakan Anda tidak ingin menggunakan ekspresi reguler:
sumber
Regex.Replace(XML, @"\s+", "")
?private static readonly Regex sWhitespace = new Regex(@"\s+"); public static string ReplaceWhitespace(string input, string replacement) { return sWhitespace.Replace(input, replacement); }
\s
berarti "cocok dengan token spasi putih", dan+
berarti "cocokkan dengan satu atau lebih dari token yang diproses". Juga RegExr adalah situs web yang bagus untuk berlatih menulis ekspresi RegEx, jika Anda ingin bereksperimen.Saya punya cara alternatif tanpa regexp, dan tampaknya berkinerja cukup baik. Ini adalah kelanjutan jawaban Brandon Moretz:
Saya mengujinya dalam unit test sederhana:
Untuk 1.000.000 percobaan, opsi pertama (tanpa regexp) berjalan dalam waktu kurang dari satu detik (700 ms pada mesin saya), dan yang kedua membutuhkan 3,5 detik.
sumber
.ToCharArray()
tidak perlu; Anda dapat menggunakan.Where()
langsung pada string.ToCharArray
lebih cepat daripada menggunakan.Where()
langsung pada string. Ini ada hubungannya dengan overhead keIEnumerable<>
dalam setiap langkah iterasi, danToCharArray
yang sangat efisien (blok-copy) dan kompiler mengoptimalkan iterasi di atas array. Mengapa perbedaan ini ada, belum ada yang bisa menjelaskan kepada saya, tetapi ukur sebelum Anda menghapusToCharArray()
.Coba ganti metode string di C #.
sumber
Solusi saya adalah dengan menggunakan Split dan Gabung dan ini sangat cepat, bahkan yang tercepat dari jawaban teratas di sini.
Pengaturan waktu untuk 10.000 loop pada string sederhana dengan spasi dan baris baru tab
Perbaiki ini dengan membungkusnya dalam metode untuk memberikan arti, dan juga menjadikannya metode ekstensi saat kita berada di ...
sumber
string[]
danchar[]
? Anda hanya perlu menentukan mana yang Anda inginkan misalnya:string.Join("", str.Split((string[])null, StringSplitOptions.RemoveEmptyEntries));
. Itulah sebenarnya yang dilakukan oleh panggilandefault
Anda dalam kasus ini karena ia kembalinull
juga: ia membantu kompiler untuk memutuskan mana yang akan dipilih. Karenanya komentar saya karena pernyataan dalam komentar Anda "Split membutuhkan array yang valid dan null tidak akan melakukan ..." salah. Bukan masalah besar, hanya dianggap layak disebut sejak Jake Drew bertanya bagaimana ini bekerja. +1 untuk jawaban Andastring.Concat("H \ne llo Wor ld".Split())
Membangun berdasarkan jawaban Henks Saya telah membuat beberapa metode pengujian dengan jawabannya dan beberapa metode yang ditambahkan dan lebih dioptimalkan. Saya menemukan hasil yang berbeda berdasarkan ukuran string input. Karena itu, saya telah menguji dengan dua set hasil. Dalam metode tercepat, sumber tertaut memiliki cara yang lebih cepat. Tapi, karena ini dicirikan sebagai tidak aman saya telah meninggalkan ini.
Input string yang panjang:
Hasil input string pendek:
Kode :
Tes :
Sunting : Diuji liner yang bagus dari Kernowcode.
sumber
Hanya sebuah alternatif karena terlihat cukup bagus :) - CATATAN: Jawaban Henks adalah yang tercepat dari ini.
Menguji 1.000.000 loop aktif
"This is a simple Test"
Metode ini = 1,74 detik
Regex = 2,58 detik
new String
(Henks) = 0,82sumber
Saya menemukan artikel bagus tentang ini di CodeProject oleh Felipe Machado (dengan bantuan oleh Richard Robertson )
Dia menguji sepuluh metode berbeda. Yang ini adalah versi tercepat yang tidak aman ...
Dan versi aman tercepat ...
Ada juga beberapa tolok ukur independen yang bagus pada Stack Overflow oleh Stian Standahl yang juga menunjukkan bagaimana fungsi Felipe sekitar 300% lebih cepat daripada fungsi tercepat berikutnya.
sumber
Jika Anda membutuhkan kinerja luar biasa, Anda harus menghindari LINQ dan ekspresi reguler dalam kasus ini. Saya melakukan beberapa pembandingan kinerja, dan tampaknya jika Anda ingin menghapus ruang putih dari awal dan akhir string, string.Trim () adalah fungsi utama Anda.
Jika Anda perlu menghapus semua spasi putih dari string, metode berikut ini berfungsi paling cepat dari semua yang telah diposting di sini:
sumber
Regex berlebihan; cukup gunakan ekstensi pada string (terima kasih Henk). Ini sepele dan seharusnya menjadi bagian dari kerangka kerja. Bagaimanapun, ini implementasi saya:
sumber
System.Linq
Berikut ini adalah alternatif linier sederhana untuk solusi RegEx. Saya tidak yakin mana yang lebih cepat; Anda harus membandingkannya.
sumber
Saya perlu mengganti spasi putih dalam string dengan spasi, tetapi tidak menduplikasi spasi. misalnya, saya perlu mengonversi sesuatu seperti yang berikut:
untuk
Saya menggunakan metode berikut
sumber
Saya menganggap respons XML Anda terlihat seperti ini:
Cara terbaik untuk memproses XML adalah dengan menggunakan parser XML, seperti LINQ ke XML :
sumber
Inilah varian lain:
Seperti sebagian besar solusi lainnya, saya belum melakukan tes benchmark lengkap, tetapi ini cukup berhasil untuk tujuan saya.
sumber
Kita bisa menggunakan:
sumber
null
.Saya telah menemukan hasil yang berbeda untuk menjadi kenyataan. Saya mencoba mengganti semua spasi putih dengan satu ruang dan regex sangat lambat.
Apa yang bekerja paling optimal untuk saya (di C ++ cli) adalah:
Saya mencoba rutin di atas terlebih dahulu dengan mengganti setiap karakter secara terpisah, tetapi harus beralih ke melakukan substring untuk bagian non-spasi. Saat melamar ke 1.200.000 karakter string:
sumber