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