在集合中执行不区分区域性的字符串操作

更新: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 的构造函数,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 实现。对于 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

其他资源

执行不区分区域性的字符串操作