컬렉션에서 문화를 구분하지 않는 문자열 작업 수행

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

참고

비교 메서드에 CultureInfo.InvariantCulture를 전달하면 문화권을 구분하지 않는 비교가 수행됩니다. 그러나 파일 경로, 레지스트리 키 및 환경 변수 등과 같은 비언어적 비교는 수행되지 않습니다. 비교 결과에 따라 보안 결정을 지원하지도 않습니다. 비언어적 비교 또는 결과 기반 보안 의사 결정에 대한 지원의 경우는 애플리케이션이 StringComparison 값을 수락하는 비교 메서드를 사용해야 합니다. 그런 다음, 애플리케이션이 StringComparison을 전달해야 합니다.

CaseInsensitiveComparer 클래스와 CaseInsensitiveHashCodeProvider 클래스 사용

CaseInsensitiveHashCodeProviderCaseInsensitiveComparer에 대한 매개 변수 없는 생성자는 Thread.CurrentCulture를 사용하여 클래스의 새 인스턴스를 초기화함으로써 문화권 구분 동작을 발생합니다. 다음 코드 예제에서는 CaseInsensitiveHashCodeProviderCaseInsensitiveComparer에 대해 매개 변수 없는 생성자를 사용하므로 문화권을 구분하는 Hashtable에 대한 생성자를 보여 줍니다.

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 매개 변수를 수락하는 생성자 중 하나를 사용하여 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 클래스 사용에 제공됩니다.

참고 항목