在集合中執行不區分文化特性的字串作業

System.Collections 命名空間中有某些類別和成員依預設會提供區分文化特性的行為。 CaseInsensitiveComparerCaseInsensitiveHashCodeProvider 類別的無參數建構函式會使用 Thread.CurrentCulture 屬性,初始化新的執行個體。 CollectionsUtil.CreateCaseInsensitiveHashtable 方法的所有多載預設都會使用 Thread.CurrentCulture 屬性,建立 Hashtable 類別的新執行個體。 ArrayList.Sort 方法的多載預設會使用 Thread.CurrentCulture 來執行區分文化特性的排序。 當字串當作索引鍵使用時,SortedList 中的排序和查閱作業可能會受到 Thread.CurrentCulture 的影響。 請遵循本節提供的使用建議,以從 Collections 命名空間中的這些類別和方法取得不區分文化特性的結果。

注意

CultureInfo.InvariantCulture 傳遞給比較方法就會執行不區分文化特性的比較。 不過,它不會讓某些項目進行非語言比較,例如檔案路徑、登錄機碼和環境變數。 它也不支援根據比較結果所做出的安全性決策。 若要進行非語言比較或需要支援根據結果的安全性決策,應用程式應該使用可接受 StringComparison 值的比較方法。 接著,應用程式應該會傳遞 StringComparison

使用 CaseInsensitiveComparerCaseInsensitiveHashCodeProvider 類別

CaseInsensitiveHashCodeProviderCaseInsensitiveComparer 的無參數建構函式會使用 Thread.CurrentCulture 來初始化類別的新執行個體,而產生區分文化特性的行為。 下列程式碼範例所示範的 Hashtable 建構函式會區分文化特性,因為它使用 CaseInsensitiveHashCodeProviderCaseInsensitiveComparer 的無參數建構函式。

internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);

如果您想要使用 CaseInsensitiveComparerCaseInsensitiveHashCodeProvider 類別建立不區分文化特性的 Hashtable,請使用可接受 culture 參數的建構函式初始化這些類別的新執行個體。 至於 culture 參數,請指定 CultureInfo.InvariantCulture。 下列程式碼範例會示範不區分文化特性之 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 方法

CollectionsUtil.CreateCaseInsensitiveHashTable 方法是很實用的捷徑,可用來建立 Hashtable 類別的新執行個體,而此類別會忽略字串的大小寫。 不過,CollectionsUtil.CreateCaseInsensitiveHashTable 方法的所有多載會區分文化特性,因為它們使用 Thread.CurrentCulture 屬性。 您無法使用此方法來建立不區分文化特性的 Hashtable。 若要建立不區分文化特性的 Hashtable,請使用可接受 culture 參數的 Hashtable 建構函式。 至於 culture 參數,請指定 CultureInfo.InvariantCulture。 下列程式碼範例會示範不區分文化特性之 Hashtable 的建構函式。

internalHashtable = New Hashtable(New
    CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
    New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
    (CultureInfo.InvariantCulture),
    new CaseInsensitiveComparer(CultureInfo.InvariantCulture));

使用 SortedList 類別

SortedList 表示索引鍵/值組的集合,這個集合按索引鍵排序,而且可以按索引鍵和索引存取。 當您使用字串是索引鍵的 SortedList 時,排序和查閱作業可能會受到 Thread.CurrentCulture 屬性的影響。 若要從 SortedList 取得不區分文化特性的行為,請使用其中一個可接受 comparer 參數的建構函式來建立 SortedListcomparer 參數會指定要在比較索引鍵時使用的 IComparer 實作。 至於參數,請指定自訂比較子類別,以使用 CultureInfo.InvariantCulture 來比較索引鍵。 下列範例說明不區分文化特性的自訂比較子類別,您可以將此類別指定為 SortedList 建構函式的 comparer 參數。

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);
    }
}

一般而言,如果您對字串使用 SortedList 卻沒有指定自訂的非變異值比較子,則在清單填入內容之後,若 Thread.CurrentCulture 有所變更,該清單可能會失效。

使用 ArrayList.Sort 方法

ArrayList.Sort 方法的多載預設會使用 Thread.CurrentCulture 屬性來執行區分文化特性的排序。 由於排序次序不同,結果會因文化特性而異。 若要消除區分文化特性的行為,請使用此方法中可接受 IComparer 實作的多載。 至於 comparer 參數,請指定自訂的非變異值比較子類別,以使用 CultureInfo.InvariantCulture使用 SortedList 類別主題會提供自訂非變異值比較子類別的範例。

另請參閱