2017-11-18 9 views
1

string[]을 허용하는 메서드가 있습니다. 이 배열을 가져 와서 우리가 가지고있는 커스텀 대수 공식에 따라 정렬합니다. 이 대수 공식은 매우 복잡하며 IEnumerable<string> 이외의 다른 수락을 허용 할 수 없거나 적용해서는 안됩니다.개체 목록을 속성 값이 포함 된 배열의 순서와 빠르게 정렬합니다.

나는 을 받아들이는이 메소드에 대한 랩퍼 함수를 ​​작성해야한다. 여기서 T은 정렬에 사용할. 자열을 표시하는 인터페이스를 구현합니다.

이것을 기반으로 유전 열거 형을 반복하고 문자열을 추출한 다음 결과 배열을 사용자 지정 정렬 함수로 전달하는 메서드를 만들었습니다. 이 작동하지만, 문자열의 정렬 된 배열로, 원래 IEnumerable <T> 완전히 연결이 끊어집니다. IEnumerable <T>을 사용자 지정 정렬 함수에서 반환 된 문자열 배열과 정렬하려면 어떻게 정렬합니까?

예를 들면.

private IEnumerable<T> Sort(IEnumerable<T> objects) where T: ICustomSortable 
{ 
    string[] stringsToSort = new string[objects.Count()]; 
    for (int i = 0; i < stringsToSort.length; i++) 
     stringsToSort[i] = objects.getString(); 

    stringsToSort = customSortFunction(stringsToSort); 

    //somehow sort the objects so that they are in the same order as stringsToSort? 
    /* 
    The result is valid when: 
    objects[0].getString() == stringsToSort[0] 
    objects[1].getString() == stringsToSort[1] 
    objects[2].getString() == stringsToSort[2] 
     ... 
    objects[n].getString() == stringsToSort[n] 
    */ 
} 

편집 : customSortFunction에서 검색된 문자열은 고유하지 않을 수 있습니다. 즉 문자열이 동일한 두 개의 objects이 모두 결과에 존재해야합니다. 동일한 문자열 값을 사용하는 objects의 순서는 부적합하지만 결과를 전체적으로 참조 할 때는 그대로 두어야합니다.

+0

전체적으로 customSortFunction()을 사용해야합니까? 두 개의 문자열을 비교할 수 있습니까? 'bool customCompare (string1, string2); '와 비슷합니까? – realharry

+0

아니요. 사용자 지정 함수를 사용해야합니다. 그리고 배열 전체를 전달해야합니다. –

+0

확인. 그 이유는 성능 때문이라고 생각하니? customSortFunction()을 호출하고 정렬 전과 후에 쌍을 비교하여'customCompare()'함수를 쉽게 구현할 수 있기 때문입니다. (한 쌍의 목록은 결국 2 요소 목록입니다.) – realharry

답변

2

필요한 것은 객체 문자열 값에서 객체 자체로의 매핑입니다.

IDictionary<string, T> 

같은 뭔가 그냥 (이전 또는 정렬 후)이 매핑을 만들고, 자신의 문자열 값을 기준으로 이루어집니다 정렬 후 (분류) 문자열 목록을 반복하고 사용하여 T의 새로운 정렬 된 목록을 작성 대응하는 T를 얻기위한 매핑.

EDIT : 문자열 값이 모두 다르지 않을 수도 있다는 의견에 따라 문자열에서 Ts 세트/목록으로의 매핑을 만드는 것만으로도 충분합니다. 뭔가 같은

IDictionary<string, IList<T>> 

[A] 당신이 IEnumberable 통해 반복하는 동안 새 (문자열) 키를 보면, (1), 새 목록을 작성하고 문자열을 소유자 T를 추가하고, (2) 이미 사전에있는 키를 찾으면 목록을 검색하고 새 소유자 T를 목록에 추가하십시오.

[B] 정렬이 완료되면 정렬 된 문자열/키 목록을 통해 해당 Ts (하나 이상)를 찾고 Ts를 연속적으로 추가하여 새 Ts 목록을 만듭니다.

이것은 가장 우아한 방법은 아닙니다 (더 나은 방법은 분명히 일종의 비교기를 사용하는 것입니다). 그러나 간단하고 작업이 완료됩니다.

+0

지정하지 않았지만 내 질문을 편집합니다. 경우에 따라 문자열이 고유하지 않을 수도 있습니다. –

+0

이 접근법은 여전히 ​​추구 될 수 있지만, [Object.ReferenceEquals] (https://msdn.microsoft.com/en-us/library/system.object)를 사용하여 동등성을 구현하는 다른 키 유형을 만들어야한다고 생각합니다. .referenceequals (v = vs.110) .aspx). 그런 식으로 동일한 값을 갖는 서로 다른 문자열 인스턴스가 사전에서 같지 않을 것입니다. 그 늙은 개 [String.Intern] (https://msdn.microsoft.com/en-us/library/system.string.intern(v=vs.110) .aspx)를주의 깊게 살펴보십시오. – allonhadaya

+1

이 알고리즘에서 볼 수있는 유일한 문제는 정렬이 안정적이지 않을 수 있다는 것입니다. 원래 문자열 정렬 algo 안정되지 않은 경우 다음이 문제가되지 않습니다. 그러나 원래 문자열이 안정적이면이 일대 다 매핑을 수행하여 해당 속성을 잃게됩니다. – realharry