다음을 통해 공유


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

업데이트: 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를 사용하여 클래스의 새 인스턴스를 초기화하며 이로 인해 문화권 구분 동작을 얻을 수 있습니다. 다음 코드 예제에서는 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 구현을 지정합니다. 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

기타 리소스

Culture의 영향을 받지 않는 문자열 작업 수행