Выполнение в коллекциях строковых операций, не зависящих от языка и региональных параметровPerforming Culture-Insensitive String Operations in Collections

В пространстве имен System.Collections существуют классы и члены, поведение которых по умолчанию зависит от языка и региональных параметров.There are classes and members in the System.Collections namespace that provide culture-sensitive behavior by default. Конструкторы без параметров для классов CaseInsensitiveComparer и CaseInsensitiveHashCodeProvider инициализируют новый экземпляр с помощью свойства Thread.CurrentCulture.The parameterless constructors for the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider classes initialize a new instance using the Thread.CurrentCulture property. Все перегрузки метода CollectionsUtil.CreateCaseInsensitiveHashtable создают новый экземпляр класса Hashtable, по умолчанию используя свойство Thread.CurrentCulture.All overloads of the CollectionsUtil.CreateCaseInsensitiveHashtable method create a new instance of the Hashtable class using the Thread.CurrentCulture property by default. Перегруженные версии метода ArrayList.Sort по умолчанию выполняют сортировку с учетом языка и региональных параметров, используя свойства Thread.CurrentCulture.Overloads of the ArrayList.Sort method perform culture-sensitive sorts by default using Thread.CurrentCulture. Если в качестве ключей используются строки, на сортировку и поиск по SortedList влияет значение Thread.CurrentCulture.Sorting and lookup in a SortedList can be affected by Thread.CurrentCulture when strings are used as the keys. Для получения результатов, не зависящих от языка и региональных параметров, для этих классов и методов в пространстве имен Collections следуйте рекомендациям, приведенным в этом разделе.Follow the usage recommendations provided in this section to obtain culture-insensitive results from these classes and methods in the Collections namespace.

Примечание. Если передать в метод сравнения CultureInfo.InvariantCulture, сравнение выполняется без учета языка и региональных параметров.Note Passing CultureInfo.InvariantCulture to a comparison method does perform a culture-insensitive comparison. Однако при этом не выполняется нелингвистическое сравнение, например для путей к файлам, разделов реестра и переменных среды.However, it does not cause a non-linguistic comparison, for example, for file paths, registry keys, and environment variables. Также не поддерживается принятие решений по безопасности на основе результата сравнения.Neither does it support security decisions based on the comparison result. Для нелингвистического сравнения и (или) поддержки принятия решений по безопасности в приложении следует использовать метод сравнения, который принимает значение StringComparison.For a non-linguistic comparison or support for result-based security decisions, the application should use a comparison method that accepts a StringComparison value. Приложение должно передавать StringComparison.The application should then pass StringComparison.

Использование классов CaseInsensitiveComparer и CaseInsensitiveHashCodeProviderUsing the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider Classes

В конструкторах без параметров для CaseInsensitiveHashCodeProvider и CaseInsensitiveComparer инициализируется новый экземпляр класса с использованием Thread.CurrentCulture. Это приводит к тому, что язык и региональные параметры учитываются при сравнении.The parameterless constructors for CaseInsensitiveHashCodeProvider and CaseInsensitiveComparer initialize a new instance of the class using the Thread.CurrentCulture, resulting in culture-sensitive behavior. В следующем примере кода показан конструктор для Hashtable, который учитывает язык и региональные параметры, так как он использует конструкторы без параметров для CaseInsensitiveHashCodeProvider и CaseInsensitiveComparer.The following code example demonstrates the constructor for a Hashtable that is culture-sensitive because it uses the parameterless constructors for CaseInsensitiveHashCodeProvider and CaseInsensitiveComparer.

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

Если вы хотите создать Hashtable, не учитывающий язык и региональные параметры, с помощью классов CaseInsensitiveComparer и CaseInsensitiveHashCodeProvider, инициализируйте новые экземпляры этих классов с помощью конструкторов, которые принимают параметр culture.If you want to create a culture-insensitive Hashtable using the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider classes, initialize new instances of these classes using the constructors that accept a culture parameter. В качестве параметра culture укажите CultureInfo.InvariantCulture.For the culture parameter, specify CultureInfo.InvariantCulture. В следующем примере кода показан конструктор для Hashtable, который не учитывает язык и региональные параметры.The following code example demonstrates the constructor for a culture-insensitive Hashtable.

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

Использование метода CollectionsUtil.CreateCaseInsensitiveHashTableUsing the CollectionsUtil.CreateCaseInsensitiveHashTable Method

Для создания нового экземпляра класса Hashtable, который не учитывает регистр строк, удобно использовать метод CollectionsUtil.CreateCaseInsensitiveHashTable.The CollectionsUtil.CreateCaseInsensitiveHashTable method is a useful shortcut for creating a new instance of the Hashtable class that ignores the case of strings. Однако все перегруженные версии метода CollectionsUtil.CreateCaseInsensitiveHashTable учитывают язык и региональные параметры, так как они используют свойство Thread.CurrentCulture.However, all overloads of the CollectionsUtil.CreateCaseInsensitiveHashTable method are culture-sensitive because they use the Thread.CurrentCulture property. С помощью этого метода нельзя создать Hashtable, который не учитывает язык и региональные параметры.You cannot create a culture-insensitive Hashtable using this method. Чтобы создать Hashtable, который не учитывает язык и региональные параметры, используйте конструктор Hashtable, который принимает параметр culture.To create a culture-insensitive Hashtable, use the Hashtable constructor that accepts a culture parameter. В качестве параметра culture укажите CultureInfo.InvariantCulture.For the culture parameter, specify CultureInfo.InvariantCulture. В следующем примере кода показан конструктор для Hashtable, который не учитывает язык и региональные параметры.The following code example demonstrates the constructor for a culture-insensitive Hashtable.

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

Использование класса SortedListUsing the SortedList Class

SortedList представляет коллекцию пар "ключ — значение", упорядоченных по ключу. Обращаться к парам можно по ключу и индексу.A SortedList represents a collection of key-and-value pairs that are sorted by the keys and are accessible by key and by index. Если используется SortedList и в качестве ключей используются строки, на поиск и сортировку может повлиять свойство Thread.CurrentCulture.When you use a SortedList where strings are the keys, the sorting and lookup can be affected by the Thread.CurrentCulture property. Чтобы SortedList не учитывал язык и региональные параметры, создайте SortedList с помощью одного из конструкторов, принимающих параметр comparer.To obtain culture-insensitive behavior from a SortedList, create a SortedList using one of the constructors that accepts a comparer parameter. Параметр comparer указывает реализацию IComparer, которую нужно использовать при сравнении ключей.The comparer parameter specifies the IComparer implementation to use when comparing keys. Для сравнения ключей в качестве параметра укажите пользовательский класс сравнения, который использует CultureInfo.InvariantCulture.For the parameter, specify a custom comparer class that uses CultureInfo.InvariantCulture to compare keys. В следующем примере показан пользовательский класс сравнения, не учитывающий язык и региональные параметры. Для этого в конструктор SortedList передается параметр comparer.The following example illustrates a custom culture-insensitive comparer class that you can specify as the comparer parameter to a SortedList constructor.

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 после заполнения списка может сделать список недействительным.In general, if you use a SortedList on strings without specifying a custom invariant comparer, a change to Thread.CurrentCulture after the list has been populated can invalidate the list.

Использование метода ArrayList.SortUsing the ArrayList.Sort Method

Перегруженные версии метода по умолчанию ArrayList.Sort выполняют сортировку с учетом языка и региональных параметров благодаря использованию свойства Thread.CurrentCulture.Overloads of the ArrayList.Sort method perform culture-sensitive sorts by default using the Thread.CurrentCulture property. Результаты могут различаться из-за различного порядка сортировки в разных языках и региональных параметрах.Results can vary by culture due to different sort orders. Чтобы результат не зависел от языка и региональных параметров, используйте перегрузки этого метода, которые принимают реализацию IComparer.To eliminate culture-sensitive behavior, use the overloads of this method that accept an IComparer implementation. В качестве параметра comparer укажите пользовательский инвариантный класс сравнения, который использует CultureInfo.InvariantCulture.For the comparer parameter, specify a custom invariant comparer class that uses CultureInfo.InvariantCulture. Пример пользовательского инвариантного класса сравнения приведен в разделе Использование класса SortedList.An example of a custom invariant comparer class is provided in the Using the SortedList Class topic.

См. такжеSee also