Kembali ke dasar-dasar: Membandingkan string

pinata

Periksa rantai kesetaraan tampaknya cukup sederhana. Dan itu bisa. Tapi seperti kebanyakan hal, ada lebih banyak di bawah tenda untuk membuatnya tampak.

Apa rantai?

C # string serangkaian 16-bit karakter Unicode. Ini berarti bahwa setiap karakter string 1112064 mungkin salah satu karakter mungkin.

Jadi sementara “Saturday” dan “sepak bola” jelas string, sehingga 萀 萁 萁 dan ഇഈഉ dan ♀♁♂ dan ☫☬☭

Sebuah intro cepat populer untuk Unicode ini diciptakan, periksa video ini

Bagaimana Anda membandingkan?

Mungkin cara yang paling umum yang saya lihat, perbandingan string menggunakan operator ==.

Terlepas dari kenyataan bahwa string adalah tipe referensi, dan mewarisi System.Object Operator == kelebihan beban ketika membandingkan string, sehingga rantai nilai, Anda mendapatkan lebih banyak ruang di memori, seperti halnya dengan jenis lain.

 // var membandingkan objek O1 = {} baru; O2 var = new {}; Console.WriteLine (& amp; amp; quot; == sama {0} & amp; amp; quot ;, o1 o2 ==); // Salah Console.WriteLine (& amp; amp; quot; ke alamat memori yang sama: {0} & amp; amp; quot;, ReferenceEquals (O1, O2)); Salah // // var s1 = DateTime.Today.DayOfWeek.ToString String perbandingan (); var s2 = C & amp; amp; quot; & Amp; Amp; quot ;; Sabtu Console.WriteLine (& amp; amp; quot; == sama {0} & amp; amp; quot; s1 == s2); // Benar Console.WriteLine (& amp; amp; quot; ke alamat memori yang sama: {0} & amp; amp; quot ;, ReferenceEquals (S1, S2)); // False 

== Operator melakukan ordinal perbandingan puzzle. Misalnya, == “Saturday” “Saturday” adalah palsu. Di bawah tenda yang pertama akan memeriksa untuk melihat apakah string properti dengan panjang yang sama, jika akan dibandingkan dengan setiap titik dalam karakter kode Unicode untuk setiap karakter.

Hal ini dapat menyebabkan hasil yang tak terduga ketika membandingkan string, ada karakter yang menampilkan karakter yang sama dalam banyak hal. Misalnya, N mungkin piñata merupakan huruf N atau karakter Unicode tunggal sebagai wanita, maka unicode karakter tilde seperti itu.

 String S1 = & amp; amp; quot; Pi & amp; amp; quot ;; String u00f1ata s2 = & amp; amp; quot; Pin & amp; amp; quot ;; u0303ata 

Kedua menampilkan kata-kata yang sama, tetapi jika kita menambahkan referensi untuk ini System.Web.Forms Console, dan kemudian tambahkan kode berikut, dan menjalankan ...

String S1 = & amp; amp; quot; Pi & amp; amp; quot ;; String u00f1ata s2 = & amp; amp; quot; Pin & amp; amp; quot ;; u0303ata hasil var = string.Format (& amp; amp; quot; Dibandingkan {0} dan {1} & amp; amp; quot ;, S1, S2); Hasil + = string.Format (& amp; amp; quot; r == Tusing {0} & amp; amp; quot; s1 == s2); Hasil + = string.Format (& amp; amp; quot; r Tusing CurrentCulture sama {0} & amp; amp; quot ;, s1.Equals (StringComparison.CurrentCulture s2)); Hasil + = string.Format (& amp; amp; quot; r Tusing InvariantCulture sama {0} & amp; amp; quot ;, s1.Equals (StringComparison.InvariantCulture s2)); Hasil String.Format + = (& amp; amp; quot; r Tusing ordinal sama {0} & amp; amp; quot ;, s1.Equals (StringComparison.Ordinal s2)); System.Windows.Forms.MessageBox.Show (hasil);

Untuk mendapatkan hasil seperti

 = 210

Di bawah Saat menjalankan perbandingan budaya-sensitif karakter untuk dipertimbangkan, tetapi jika melakukan perbandingan ordinal dianggap tidak hanya Unicode poin kode. Oleh karena itu, perbandingan berurutan dari dua rantai untuk melihat bahwa perbandingan lain budaya sensitif untuk berkonsultasi sama.

Options StringComparison.CurrentCulture menggunakan budaya saat mata pelajaran yang dapat ditentukan berdasarkan System.Threading .Thread.CurrentThread.CurrentCulture.

Penggunaan tawaran StringComparison.InvariantCulture "universal" secara longgar didasarkan pada budaya en-US.

Ketiga nilai pencacahan Sting.Comparison digunakan di atas adalah ignorecase, yang cukup jelas.

Apa pengembalian?

Untuk mendapatkan gambaran kasar dari kinerja relatif dari beberapa cara yang berbeda untuk membandingkan string yang dapat Anda mengajukan aplikasi dan menjalankan konsol berikutnya.

 // membangun beberapa string untuk bermain var x = string baru ('X', 99999999); var s1 = x + dan amp; quot; Y & amp; amp; quot ;; var x + s2 = & amp; amp; quot; X & amp; Amp; quot ;; SW System.Diagnostics.Stopwatch var = baru (); Hasil var = Kamus baru & amp; amp; lt; Chain & amp; amp; gt; (); foreach (C StringComparison Enum.GetValues ​​(typeof (StringComparison))) {sw.Start (); AreEqual s1.Equals var = (S2, C); sw.Stop (); results.Add (c.ToString () sw.ElapsedMilliseconds); sw.Reset (); } // Bagaimana hanya === sw.Start (); var s1 == s2 = sama; sw.Stop (); results.Add (& amp; amp; quot; == & amp; amp; quot ;, sw.ElapsedMilliseconds); sw.Reset (); //String.Compare Sw.Start (); String.Compare (S1, S2); sw.Stop (); results.Add (& amp; amp; quot; String.Compare & amp; amp; quot ;, sw.ElapsedMilliseconds); sw.Reset (); // Kecil dan huruf besar di tolower yang () sw.Start mengukur baik (); = Sama s1.ToLower () == s2.ToLower (); sw.Stop (); results.Add (& amp; amp; quot; tolower () dan == & amp; amp; quot ;, sw.ElapsedMilliseconds); sw.Reset (); Console.WriteLine (& amp; amp; quot; Kerangka Kinerja: {0} & amp; amp; quot ;, Environment.Version); foreach (var r results.OrderBy (r = & amp; amp; gt; r.Value)) {Console.WriteLine (& amp; amp; quot; {0} milidetik: {1} & amp; amp; quot ;, r.Value , r.Key); Console.ReadLine} (); 

 StingComparePerformance

Bahkan, hanya terdiri dari dua baris yang sangat panjang diikuti yang sama panjang dan hanya berbeda dengan nilai karakter terakhir. Anda dapat membandingkan dan meludah waktu milidetik untuk melakukan berbagai perbandingan.

kinerja yang buruk diharapkan dan dipahami untuk mengkonversi dua string tolower () membandingkan sebelum. Karena string yang berubah semua panggilan tolower () menyebabkan salinan baru dalam memori, teknik ini pada akhir (setelah dua rantai awalnya terdiri) empat salinan ini baris yang sangat panjang dari memori.

Yang mengejutkan adalah kinerja yang buruk dari pilihan StringComparison.OrdinalIgnoreCase. Terutama karena Microsoft mengatakan itu harus "Gunakan atau perbandingan StringComparison.Ordinal StringComparison.OrdinalIgnoreCase untuk kinerja yang lebih baik."



Tags: , , ,