在集合中執行不區分文化特性的字串作業
System.Collections 命名空間中有某些類別和成員依預設會提供區分文化特性的行為。 CaseInsensitiveComparer 和 CaseInsensitiveHashCodeProvider 類別的無參數建構函式會使用 Thread.CurrentCulture 屬性,初始化新的執行個體。 CollectionsUtil.CreateCaseInsensitiveHashtable 方法的所有多載預設都會使用 Thread.CurrentCulture
屬性,建立 Hashtable 類別的新執行個體。 ArrayList.Sort 方法的多載預設會使用 Thread.CurrentCulture
來執行區分文化特性的排序。 當字串當作索引鍵使用時,SortedList 中的排序和查閱作業可能會受到 Thread.CurrentCulture
的影響。 請遵循本節提供的使用建議,以從 Collections
命名空間中的這些類別和方法取得不區分文化特性的結果。
注意
將 CultureInfo.InvariantCulture 傳遞給比較方法就會執行不區分文化特性的比較。 不過,它不會讓某些項目進行非語言比較,例如檔案路徑、登錄機碼和環境變數。 它也不支援根據比較結果所做出的安全性決策。 若要進行非語言比較或需要支援根據結果的安全性決策,應用程式應該使用可接受 StringComparison 值的比較方法。 接著,應用程式應該會傳遞 StringComparison。
使用 CaseInsensitiveComparer
和 CaseInsensitiveHashCodeProvider
類別
CaseInsensitiveHashCodeProvider
和 CaseInsensitiveComparer
的無參數建構函式會使用 Thread.CurrentCulture
來初始化類別的新執行個體,而產生區分文化特性的行為。 下列程式碼範例所示範的 Hashtable
建構函式會區分文化特性,因為它使用 CaseInsensitiveHashCodeProvider
和 CaseInsensitiveComparer
的無參數建構函式。
internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
如果您想要使用 CaseInsensitiveComparer
和 CaseInsensitiveHashCodeProvider
類別建立不區分文化特性的 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 實作。 至於參數,請指定自訂比較子類別,以使用 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 類別主題會提供自訂非變異值比較子類別的範例。