컬렉션에서 Culture를 구분하지 않는 문자열 작업 수행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. CaseInsensitiveComparerCaseInsensitiveHashCodeProvider 클래스의 매개 변수 없는 생성자는 Thread.CurrentCulture 속성을 사용하여 새 인스턴스를 초기화합니다.The parameterless constructors for the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider classes initialize a new instance using the Thread.CurrentCulture property. CollectionsUtil.CreateCaseInsensitiveHashtable 메서드의 모든 오버로드는 기본적으로 Thread.CurrentCulture 속성을 사용하여 Hashtable 클래스의 새 인스턴스를 만듭니다.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를 전달하면 문화권을 구분하지 않는 비교가 수행됩니다.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 및 CaseInsensitiveHashCodeProvider 클래스 사용Using the CaseInsensitiveComparer and CaseInsensitiveHashCodeProvider Classes

CaseInsensitiveHashCodeProviderCaseInsensitiveComparer에 대한 매개 변수 없는 생성자는 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. 다음 코드 예제에서는 CaseInsensitiveHashCodeProviderCaseInsensitiveComparer에 대해 매개 변수 없는 생성자를 사용하므로 문화권을 구분하는 Hashtable에 대한 생성자를 보여 줍니다.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);

CaseInsensitiveComparerCaseInsensitiveHashCodeProvider 클래스를 사용하여 문화권을 구분하지 않는 Hashtable을 만들려는 경우 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.CreateCaseInsensitiveHashtable 메서드 사용Using the CollectionsUtil.CreateCaseInsensitiveHashTable Method

CollectionsUtil.CreateCaseInsensitiveHashTable 메서드는 문자열의 대/소문자를 무시하는 Hashtable 클래스의 새 인스턴스를 만드는 데 유용한 바로 가기입니다.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을 만들려면 culture 매개 변수를 수락하는 Hashtable 생성자를 사용합니다.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));

SortedList 클래스 사용Using 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에서 문화권을 구분하지 않는 동작을 가져오려면 comparer 매개 변수를 수락하는 생성자 중 하나를 사용하여 SortedList를 만듭니다.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.Sort 메서드 사용Using 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