Apakah ada cara yang lebih baik untuk melakukan ini ...
MyString.Trim().Replace("&", "and").Replace(",", "").Replace(" ", " ")
.Replace(" ", "-").Replace("'", "").Replace("/", "").ToLower();
Saya telah memperluas kelas string agar tetap menjadi satu pekerjaan tetapi apakah ada cara yang lebih cepat?
public static class StringExtension
{
public static string clean(this string s)
{
return s.Replace("&", "and").Replace(",", "").Replace(" ", " ")
.Replace(" ", "-").Replace("'", "").Replace(".", "")
.Replace("eacute;", "é").ToLower();
}
}
Hanya untuk bersenang-senang (dan untuk menghentikan argumen di komentar) saya telah mendorong inti dari berbagai contoh di bawah ini.
Skor opsi regex sangat buruk; opsi kamus muncul paling cepat; versi panjang dari stringbuilder replace sedikit lebih cepat dari tangan pendek.
c#
string
refactoring
immutability
Chris McKee
sumber
sumber
Jawaban:
Lebih cepat - tidak. Lebih efektif - ya, jika Anda akan menggunakan
StringBuilder
kelas. Dengan implementasi Anda, setiap operasi menghasilkan salinan string yang dalam keadaan dapat mengganggu kinerja. String adalah objek yang tidak dapat diubah sehingga setiap operasi hanya mengembalikan salinan yang dimodifikasi.Jika Anda mengharapkan metode ini dipanggil secara aktif pada beberapa dengan
Strings
panjang yang signifikan, mungkin lebih baik untuk "memigrasi" implementasinya keStringBuilder
kelas. Dengannya modifikasi apa pun dilakukan secara langsung pada instance itu, jadi Anda tidak perlu melakukan operasi penyalinan yang tidak perlu.public static class StringExtention { public static string clean(this string s) { StringBuilder sb = new StringBuilder (s); sb.Replace("&", "and"); sb.Replace(",", ""); sb.Replace(" ", " "); sb.Replace(" ", "-"); sb.Replace("'", ""); sb.Replace(".", ""); sb.Replace("eacute;", "é"); return sb.ToString().ToLower(); } }
sumber
Jika Anda hanya mencari solusi yang bagus dan tidak perlu menghemat beberapa nanodetik, bagaimana dengan gula LINQ?
var input = "test1test2test3"; var replacements = new Dictionary<string, string> { { "1", "*" }, { "2", "_" }, { "3", "&" } }; var output = replacements.Aggregate(input, (current, replacement) => current.Replace(replacement.Key, replacement.Value));
sumber
ini akan lebih efisien:
public static class StringExtension { public static string clean(this string s) { return new StringBuilder(s) .Replace("&", "and") .Replace(",", "") .Replace(" ", " ") .Replace(" ", "-") .Replace("'", "") .Replace(".", "") .Replace("eacute;", "é") .ToString() .ToLower(); } }
sumber
Mungkin sedikit lebih mudah dibaca?
public static class StringExtension { private static Dictionary<string, string> _replacements = new Dictionary<string, string>(); static StringExtension() { _replacements["&"] = "and"; _replacements[","] = ""; _replacements[" "] = " "; // etc... } public static string clean(this string s) { foreach (string to_replace in _replacements.Keys) { s = s.Replace(to_replace, _replacements[to_replace]); } return s; } }
Juga tambahkan saran Baru Di Kota tentang StringBuilder ...
sumber
private static Dictionary<string, string> _replacements = new Dictionary<string, string>() { {"&", "and"}, {",", ""}, {" ", " "} /* etc */ };
List<Tuple<string,string>>
. Ini juga mengubah urutan penggantian yang diambil DAN tidak secepat miss.Replace("a").Replace("b").Replace("c")
. Jangan gunakan ini!Ada satu hal yang dapat dioptimalkan dalam solusi yang disarankan. Memiliki banyak panggilan untuk
Replace()
membuat kode melakukan beberapa lintasan pada string yang sama. Dengan string yang sangat panjang, solusinya mungkin lambat karena kapasitas cache CPU meleset. Mungkin salah satu harus mempertimbangkan untuk mengganti beberapa string dalam sekali jalan .sumber
Opsi lain yang menggunakan linq adalah
[TestMethod] public void Test() { var input = "it's worth a lot of money, if you can find a buyer."; var expected = "its worth a lot of money if you can find a buyer"; var removeList = new string[] { ".", ",", "'" }; var result = input; removeList.ToList().ForEach(o => result = result.Replace(o, string.Empty)); Assert.AreEqual(expected, result); }
sumber
var removeList = new List<string> { /*...*/ };
lalu memanggilremoveList.ForEach( /*...*/ );
dan menyederhanakan kode Anda. Perhatikan juga bahwa itu tidak sepenuhnya menjawab pertanyaan karena semua string yang ditemukan diganti denganString.Empty
.Saya melakukan sesuatu yang serupa, tetapi dalam kasus saya, saya melakukan serialisasi / De-serialisasi jadi saya harus bisa pergi ke dua arah. Saya menemukan menggunakan string [] [] bekerja hampir identik dengan kamus, termasuk inisialisasi, tetapi Anda bisa pergi ke arah lain juga, mengembalikan pengganti ke nilai aslinya, sesuatu yang kamus sebenarnya tidak diatur untuk dilakukan.
Edit: Anda dapat menggunakan
Dictionary<Key,List<Values>>
untuk mendapatkan hasil yang sama seperti string [] []sumber
string input = "it's worth a lot of money, if you can find a buyer."; for (dynamic i = 0, repl = new string[,] { { "'", "''" }, { "money", "$" }, { "find", "locate" } }; i < repl.Length / 2; i++) { input = input.Replace(repl[i, 0], repl[i, 1]); }
sumber