Melakukan operasi string yang tidak peka budaya dalam koleksi
Ada kelas dan anggota di System.Collections namespace layanan yang menyediakan perilaku sensitif budaya secara default. Konstruktor tanpa parameter untuk CaseInsensitiveComparer kelas dan CaseInsensitiveHashCodeProvider menginisialisasi instans baru menggunakan Thread.CurrentCulture properti . Semua kelebihan beban metode membuat instans CollectionsUtil.CreateCaseInsensitiveHashtableHashtable baru kelas menggunakan Thread.CurrentCulture
properti secara default. Kelebihan beban ArrayList.Sort metode melakukan pengurutan sensitif budaya secara default menggunakan Thread.CurrentCulture
. Pengurutan dan pencarian dalam SortedList dapat dipengaruhi oleh Thread.CurrentCulture
ketika string digunakan sebagai kunci. Ikuti rekomendasi penggunaan yang disediakan di bagian ini untuk mendapatkan hasil yang tidak peka terhadap budaya dari kelas dan metode ini di Collections
namespace layanan.
Catatan
Meneruskan ke metode perbandingan memang melakukan perbandingan CultureInfo.InvariantCulture yang tidak peka budaya. Namun, itu tidak menyebabkan perbandingan non-linguistik, misalnya, untuk jalur file, kunci registri, dan variabel lingkungan. Juga tidak mendukung keputusan keamanan berdasarkan hasil perbandingan. Untuk perbandingan atau dukungan nonbahasa untuk keputusan keamanan berbasis hasil, aplikasi harus menggunakan metode perbandingan StringComparison yang menerima nilai. Aplikasi kemudian harus lulus StringComparison.
CaseInsensitiveComparer
Menggunakan kelas dan CaseInsensitiveHashCodeProvider
Konstruktor tanpa parameter untuk CaseInsensitiveHashCodeProvider
dan CaseInsensitiveComparer
menginisialisasi instans baru kelas menggunakan Thread.CurrentCulture
, menghasilkan perilaku sensitif terhadap budaya. Contoh kode berikut menunjukkan konstruktor untuk Hashtable
yang sensitif terhadap budaya karena menggunakan konstruktor tanpa parameter untuk CaseInsensitiveHashCodeProvider
dan CaseInsensitiveComparer
.
internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
Jika Anda ingin membuat budaya yang tidak peka Hashtable
menggunakan CaseInsensitiveComparer
kelas dan CaseInsensitiveHashCodeProvider
, inisialisasi instans baru dari kelas-kelas ini menggunakan konstruktor yang menerima culture
parameter. culture
Untuk parameter , tentukan CultureInfo.InvariantCulture. Contoh kode berikut menunjukkan konstruktor untuk budaya yang tidak sensitif Hashtable
.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
CollectionsUtil.CreateCaseInsensitiveHashTable
Gunakan metode
Metode CollectionsUtil.CreateCaseInsensitiveHashTable
ini adalah pintasan yang berguna untuk membuat instans Hashtable
baru kelas yang mengabaikan kasus string. Namun, semua kelebihan beban CollectionsUtil.CreateCaseInsensitiveHashTable
metode sensitif terhadap budaya karena menggunakan Thread.CurrentCulture
properti . Anda tidak dapat membuat budaya-tidak sensitif Hashtable
menggunakan metode ini. Untuk membuat budaya yang tidak sensitif Hashtable
, gunakan Hashtable
konstruktor yang menerima culture
parameter. culture
Untuk parameter , tentukan CultureInfo.InvariantCulture
. Contoh kode berikut menunjukkan konstruktor untuk budaya yang tidak sensitif Hashtable
.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
SortedList
Menggunakan kelas
mewakili SortedList
kumpulan pasangan kunci dan nilai yang diurutkan menurut kunci dan dapat diakses oleh kunci dan menurut indeks. Saat Anda menggunakan SortedList
di mana string adalah kunci, pengurutan dan pencarian dapat dipengaruhi oleh Thread.CurrentCulture
properti . Untuk mendapatkan perilaku tidak sensitif budaya dari SortedList
, buat SortedList
menggunakan salah satu konstruktor yang menerima comparer
parameter. Parameter comparer
menentukan implementasi yang IComparer akan digunakan saat membandingkan kunci. Untuk parameter , tentukan kelas pembanding kustom yang menggunakan CultureInfo.InvariantCulture
untuk membandingkan kunci. Contoh berikut mengilustrasikan kelas pembanding yang tidak peka budaya kustom yang dapat Anda tentukan sebagai comparer
parameter ke SortedList
konstruktor.
Imports System.Collections
Imports System.Globalization
Friend Class InvariantComparer
Implements IComparer
Private m_compareInfo As CompareInfo
Friend Shared [Default] As New InvariantComparer()
Friend Sub New()
m_compareInfo = CultureInfo.InvariantCulture.CompareInfo
End Sub
Public Function Compare(a As Object, b As Object) As Integer _
Implements IComparer.Compare
Dim sa As String = CType(a, String)
Dim sb As String = CType(b, String)
If Not (sa Is Nothing) And Not (sb Is Nothing) Then
Return m_compareInfo.Compare(sa, sb)
Else
Return Comparer.Default.Compare(a, b)
End If
End Function
End Class
using System;
using System.Collections;
using System.Globalization;
internal class InvariantComparer : IComparer
{
private CompareInfo _compareInfo;
internal static readonly InvariantComparer Default = new
InvariantComparer();
internal InvariantComparer()
{
_compareInfo = CultureInfo.InvariantCulture.CompareInfo;
}
public int Compare(Object a, Object b)
{
if (a is string sa && b is string sb)
return _compareInfo.Compare(sa, sb);
else
return Comparer.Default.Compare(a,b);
}
}
Secara umum, jika Anda menggunakan SortedList
pada string tanpa menentukan perbandingan invarian kustom, perubahan Thread.CurrentCulture
ke setelah daftar diisi dapat membatalkan daftar.
ArrayList.Sort
Gunakan metode
Kelebihan beban ArrayList.Sort
metode melakukan pengurutan sensitif budaya secara default menggunakan Thread.CurrentCulture
properti . Hasil dapat bervariasi menurut budaya karena urutan pengurutan yang berbeda. Untuk menghilangkan perilaku sensitif budaya, gunakan kelebihan beban metode ini yang menerima IComparer
implementasi. comparer
Untuk parameter , tentukan kelas pembanding invarian kustom yang menggunakan CultureInfo.InvariantCulture
. Contoh kelas pembanding invarian kustom disediakan dalam topik Menggunakan Kelas DaftarUrut.
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk