2009-04-19 2 views
1

단어 목록을 포함하는 배열을 정렬하고 binarysearch를 사용하여 동일한 단어를 검색해야합니다. 특정 이유로 인해 단어 목록은 'en-US'즉 미국 지역 설정의 정렬 규칙을 사용하여 항상 정렬되어야합니다. 이 코드는 다양한 국제 운영 체제에서 실행되며 이는 물론 단어 목록이 사용중인 지역 국가 별 설정에 따라 다르게 정렬된다는 것을 의미합니다. 리투아니아 국가 별 설정으로 실행되는 컴퓨터/장치에서 한 가지 문제가 발생할 수 있습니다. 왜? 대부분의 언어에서 문자 "Y는"리투아니아어 동안 X- Y -Z처럼 분류되어 있기 때문에, 정렬 순서는 I- Y -J이다. 이 동작은 내 프로그램에 혼란을 야기 할 수 있습니다. 데스크탑-PC에.net - Array.Sort 및 Array.BinarySearch 문제 - 문화 및 세계화

, 내가 사용하여 순간적으로 미국 영어로 국가 별 설정을 변경할 수 있습니다 :

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture ("en-US입니다") 그러나

이후 Windows Mobile (CF.NET) 용으로 개발 중이므로이 코드는 구현할 수 없습니다.

프로그래밍 방식으로 장치의 국가 별 설정을 변경할 수있는 해킹이 발견되었지만 "공식적인"것이 아니므로 위험한 것으로 간주되어이를 방지하는 것이 좋습니다.

내 질문은 : Array.Sort 및 Array.BinarySearch를 사용하여 장치에서 설정된 국가 별 설정에 상관없이 정렬 및 검색하는 동안 CultureInfo = "en-US"를 사용하도록 강제 설정하려면 어떻게해야합니까?

Public Shared Function BinarySearch(Of T) (_ 
    array As T(), _ 
    value As T, _ 
    comparer As IComparer(Of T) _ 
) As Integer 

을하고 (이 "EN-US"를 선택하고 설정) 고려 CultureInfo를 고려하는 비교자를 구현하지만 열심히 노력에도 불구하고 있음을 수행하는 방법을 알고하지 않습니다

은 내가 사용할 수 있으리라 생각합니다. 누구든지 VB.Net이나 C# 또는 샘플 코드를 게시하는 방법에 대해 설명해 주시면 매우 감사하게 생각합니다.

CF.Net에서 작동하는 대안 솔루션에 대해 알고 계시다면, 물론 나는 모든 귀입니다.

감사합니다.

편집 :

내 질문부터 허용 솔루션은 분명 내가 영어와의 연결을 유지하고 싶다고 언급 한 바와 같이 나는 Twanfosson의 답변을 고려할 것입니다.

그러나 융통성있는 방법으로 Guffa의 대답이 최선이라고 생각합니다. 왜? 다른 예를 들어 봅시다 : 독일어의 경우 ÖÖ -X-Z로 분류되어 있습니다. 스웨덴어와 핀란드의 경우 순서는 X-Z-Ö입니다. 에스토니아어의 경우 정렬 순서는 Z-Ö-X입니다. 복잡하지 않니? Guffa의 솔루션은 독일어 지역 설정에서 실행되는 장치에서 Swedish sorting-oder (CultureInfo 변경)를 강제 적용하도록합니다. Comparer.DefaultInvariant을 영어로 사용하면이 경우 도움이되지 않습니다. 아마도 Ö이 결국 O가됩니다. 따라서 투표는 Guffa로 이동합니다.

답변

5

Invariant 문화권을 사용할 수 있습니까?

InvariantCulture는 고정 문화권의 인스턴스를 검색합니다. 과 연결된 이지만 어느 국가/지역도 아닙니다.

불변의 문화권을 사용하면 사소한 것이됩니다.

Array.Sort(myArray, Comparer.DefaultInvariant); 

Array.BinarySearch(myArray, myString, Comparer.DefaultInvariant); 
1

이 시도 :

class EnglishComparer : IComparer<string> 
{ 
    static CultureInfo __english = new CultureInfo("en-US"); 

    public int Compare(string x, string y) 
    { 
    return string.Compare(x, y, __english, CompareOptions.None); 
    } 
} 
6

글쎄, 모두에 대한 대답은 비교자를 구현하는 것입니다. 이제

Public Class StringComparerEnUs 
    Implements IComparer(Of String) 

    Private _culture As CultureInfo 

    Public Sub New() 
     _culture = New CultureInfo("en-US") 
    End Sub 

    Public Function Compare(ByVal x As String, ByVal y As String) 
     Return String.Compate(x, y, false, _culture) 
    End Function 

End Class 

당신이 문자열을 정렬하는 데 사용할 수 있습니다 :

Array.Sort(theArray, New StringComparerEnUs()) 

을 그들을 찾기 위해 IComprarer(Of String) 인터페이스를 구현하고 문자열을 비교하는 데 사용하는 그 자체가 CultureInfo 개체가있는 클래스를 만듭니다 :

pos = BinarySearch(theArray, "Dent, Arthur", new StringComparerEnUs()) 

(클래스는 물론 생성자에서 문화 문자열을 받아 들여서 좀 더 일반화 할 수 있으며, 변수를 사용하여 String.Compare 호출에서 ignorecase 매개 변수를 사용하십시오.