共用方式為


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

更新:2007 年 11 月

System.Collections 命名空間中有類別和成員,預設會提供區分文化特性的行為。CaseInsensitiveComparerCaseInsensitiveHashCodeProvider 類別的預設建構函式會使用 Thread.CurrentCulture 屬性初始化新的執行個體。CollectionsUtil.CreateCaseInsensitiveHashTable 方法的所有多載會在預設情況下使用 Thread.CurrentCulture 屬性建立 Hashtable 類別的新執行個體。預設情況下,ArrayList.Sort 方法的多載會使用 Thread.CurrentCulture 執行區分文化特性排序。若使用字串做為索引鍵,則 SortedList 中的排序和查閱會受到 Thread.CurrentCulture 影響。請遵照本章節中提供的使用建議,從 Collections 命名空間的這些類別和方法取得不區分文化特性的結果。

使用 CaseInsensitiveComparer 和 CaseInsensitiveHashCodeProvider 類別

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 參數的其中一個建構函式,建立 SortedList。比較索引鍵時,comparer 參數會指定使用 IComparer 實作。對於 IComparer 參數,請指定一個使用 CultureInfo.InvariantCulture 的自訂比較子類別來比較索引鍵。下列範例說明了自訂不區分文化特性的比較子類別,您可以將之指定為 SortedList 建構函式的 IComparer 參數。

Imports System
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 m_compareInfo;
    internal static readonly InvariantComparer Default = new
        InvariantComparer();

    internal InvariantComparer() 
    {
        m_compareInfo = CultureInfo.InvariantCulture.CompareInfo;
    }
    
    public int Compare(Object a, Object b)
    {
        String sa = a as String;
        String sb = b as String;
        if (sa != null && sb != null)
            return m_compareInfo.Compare(sa, sb);
        else
            return Comparer.Default.Compare(a,b);
    }
}

一般而言,如果您在字串上使用 SortedList 卻沒有指定自訂不因比較子而異,在清單已填入後對 Thread.CurrentCulture 進行的變更可以使清單失效。

使用 ArrayList.Sort 方法

ArrayList.Sort 方法的多載會在預設情況下使用 Thread.CurrentCulture 屬性執行區分文化特性排序。因不同排序次序,結果可以因文化特性而有所不同。若要排除區分文化特性的行為,請使用這個接受 IComparer 參數之方法的多載。對於 IComparer 參數,請指定使用 CultureInfo.InvariantCulture 的自訂不因比較子而異的類別。自訂不因比較子而異的類別之範例在使用 SortedList 類別主題中有提供。

請參閱

參考

CaseInsensitiveComparer

CaseInsensitiveHashCodeProvider

CollectionsUtil.CreateCaseInsensitiveHashTable 方法

ArrayList.Sort

SortedList

Hashtable

IComparer

其他資源

執行不區分文化特性的字串作業