다음을 통해 공유


컬렉션에서 문화에 민감하지 않은 문자열 작업 수행

네임스페이스 System.Collections에는 기본적으로 지역 문화에 민감한 동작을 제공하는 클래스와 멤버가 있습니다. CaseInsensitiveComparerCaseInsensitiveHashCodeProvider 클래스에 대한 매개 변수가 없는 생성자는 속성 Thread.CurrentCulture을 사용하여 새 인스턴스를 초기화합니다. 모든 CollectionsUtil.CreateCaseInsensitiveHashtable 메서드의 오버로드는 기본적으로 Hashtable 속성을 사용하여 Thread.CurrentCulture 클래스의 새 인스턴스를 만듭니다. 메서드의 ArrayList.Sort 오버로드는 기본적으로 Thread.CurrentCulture를 사용하여 문화권 구분 정렬을 수행합니다. SortedList에서 문자열을 키로 사용할 때, 조회 및 정렬이 Thread.CurrentCulture에 의해 영향을 받을 수 있습니다. 이 섹션에 제공된 사용 권장 사항을 따라 네임스페이스 Collections에서 이러한 클래스 및 메서드의 문화에 민감하지 않은 결과를 얻으십시오.

비고

비교 메서드에 전달 CultureInfo.InvariantCulture 하면 문화권을 구분하지 않는 비교가 수행됩니다. 그러나 파일 경로, 레지스트리 키 및 환경 변수와 같이 비언어적 비교는 발생하지 않습니다. 비교 결과에 따라 보안 결정을 지원하지도 않습니다. 비언어적 비교나 결과 기반 보안 결정을 지원하려면, 응용 프로그램은 StringComparison 값을 허용하는 비교 메서드를 사용해야 합니다. 그 후에는 애플리케이션이 StringComparison를 전달해야 합니다.

CaseInsensitiveComparerCaseInsensitiveHashCodeProvider 클래스 사용

매개변수가 없는 생성자는 CaseInsensitiveHashCodeProvider, CaseInsensitiveComparer 클래스를 새 인스턴스로 초기화하여 Thread.CurrentCulture를 사용해 문화에 민감한 동작을 생성합니다. 다음 코드 예제는 매개변수가 없는 HashtableCaseInsensitiveHashCodeProvider 생성자를 사용하여 문화권 구분이 가능한 CaseInsensitiveComparer 생성자를 보여줍니다.

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

문화에 구애받지 않는 Hashtable를 만들고자 한다면, CaseInsensitiveComparerCaseInsensitiveHashCodeProvider 클래스를 사용하고, 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를 만들려면 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));

SortedList 클래스 사용

A SortedList 는 키별로 정렬되고 키 및 인덱스별로 액세스할 수 있는 키 및 값 쌍의 컬렉션을 나타냅니다. 문자열이 키인 SortedList 위치를 사용하면 정렬 및 조회가 속성의 Thread.CurrentCulture 영향을 받을 수 있습니다. 문화에 민감하지 않은 동작을 SortedList에서 얻으려면, SortedList 매개변수를 허용하는 생성자 중 하나를 사용하여 comparer을(를) 만드세요. comparer 매개 변수는 키를 비교할 때 사용할 IComparer 구현을 지정합니다. 매개 변수의 경우 키를 비교하는 데 사용하는 CultureInfo.InvariantCulture 사용자 지정 비교자 클래스를 지정합니다. 다음 예제는 생성자에 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 클래스 사용 항목에서 사용자 지정 고정 비교자 클래스의 예가 제공됩니다.

참고하십시오