컬렉션에서 문화를 구분하지 않는 문자열 작업 수행
System.Collections 네임스페이스에는 기본적으로 문화권 구분 동작을 제공하는 클래스 및 멤버가 있습니다. CaseInsensitiveComparer 및 CaseInsensitiveHashCodeProvider 클래스의 매개 변수 없는 생성자는 Thread.CurrentCulture 속성을 사용하여 새 인스턴스를 초기화합니다. CollectionsUtil.CreateCaseInsensitiveHashtable 메서드의 모든 오버로드는 기본적으로 Thread.CurrentCulture
속성을 사용하여 Hashtable 클래스의 새 인스턴스를 만듭니다. ArrayList.Sort 메서드의 오버로드는 기본적으로 Thread.CurrentCulture
를 사용하여 문화권 구분 정렬을 수행합니다. 문자열이 키로 사용될 경우 SortedList의 정렬 및 조회는 Thread.CurrentCulture
의 영향을 받을 수 있습니다. Collections
네임스페이스의 이러한 클래스 및 메서드에서 문화권을 구분하는 결과를 얻으려면 이 섹션에 제공된 사용 권장 사항을 따릅니다.
참고 항목
비교 메서드에 CultureInfo.InvariantCulture를 전달하면 문화권을 구분하지 않는 비교가 수행됩니다. 그러나 파일 경로, 레지스트리 키 및 환경 변수 등과 같은 비언어적 비교는 수행되지 않습니다. 비교 결과에 따라 보안 결정을 지원하지도 않습니다. 비언어적 비교 또는 결과 기반 보안 의사 결정에 대한 지원의 경우는 애플리케이션이 StringComparison 값을 수락하는 비교 메서드를 사용해야 합니다. 그런 다음, 애플리케이션이 StringComparison을 전달해야 합니다.
CaseInsensitiveComparer
클래스와 CaseInsensitiveHashCodeProvider
클래스 사용
CaseInsensitiveHashCodeProvider
및 CaseInsensitiveComparer
에 대한 매개 변수 없는 생성자는 Thread.CurrentCulture
를 사용하여 클래스의 새 인스턴스를 초기화함으로써 문화권 구분 동작을 발생합니다. 다음 코드 예제에서는 CaseInsensitiveHashCodeProvider
및 CaseInsensitiveComparer
에 대해 매개 변수 없는 생성자를 사용하므로 문화권을 구분하는 Hashtable
에 대한 생성자를 보여 줍니다.
internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
CaseInsensitiveComparer
및 CaseInsensitiveHashCodeProvider
클래스를 사용하여 문화권을 구분하지 않는 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 클래스 사용에 제공됩니다.
참고 항목
.NET