2012-07-05 5 views
3

최근 소스가 보관 된 여러 소스에서 내역 항목의 고유 목록을 만들어야합니다. 나는 이와 같은 것을 시도하고 있지만 문제 도메인 때문에 결과가 정확한지 간단하지 않다.Powershell Sort-Object는 안정된 정렬을 사용합니까

Function GetUnique { 
    param($source1, $source2, ...) 

    $items = $source1 + $source2 + ...; 

    $unique = $items | Sort-Object -Desc -Unique -Prop Timestamp; 

    # Does this contain the most recent items? 

    $unique; 
} 

나는 놀랍지 만 거기에는 환경 설정을 나타내는 스위치가 없다.

참고 : 정렬이 안정적이라도 고유성 알고리즘에 대한 가정을하고 있음을 알고 있습니다. 정렬이 안정적이라면 안정적인 정렬 된 입력을 가정하여 상대적으로 쉽게 내 자신 만의 안정적인 Get-Unique 커맨드 릿을 작성할 수 있습니다. 그러나 MergeSort를 구현하고 싶지는 않습니다.

+0

PowerShell은'List.Sort' 또는 LINQ의'OrderBy' (적어도 Pash에서하는 것)를 사용하기 때문에 실제 알고리즘은 .NET 버전에 따라 변경 될 수도 있습니다. – Joey

답변

3

내 시나리오를 버린 후, 정렬이 실제로 안정적이지는 않지만 안정된 방식으로 순서가 반전된다는 간단한 테스트를 발견했습니다. 참고로, 사용하고있는 테스트 세트는 꽤 작기 때문에 이러한 결과는 결정적이지는 않지만 재현 가능합니다.

function f ([String] $name, [int] $value) ` 
{ 
    return New-Object PSObject -Property @{ Name=$name; Value=$value } | 
     select Name,Value; 
}; 
$test = (f a 1),(f a 2),(f a 3),(f b 1),(f b 2); 
"`n`$test;" 
$test; 
"`n`$test | sort name;" 
$test | sort name; 
"`n`$test | sort name -Desc;" 
$test | sort name -Desc; 
"`n`$test | sort name | sort name;" 
$test | sort name | sort name; 
"`n`$test | sort value | sort name;" 
$test | sort value | sort name; 
"`n`$test | sort value;" 
$test | sort value; 

결과는 다음과 같다 :

나는 https://connect.microsoft.com/PowerShell/feedback/details/752455/provide-stable-switch-for-sort-object-cmdlet에서이에 관한 PS 팀에 제안을 제출 한
$test; 
Name             Value 
----             ----- 
a               1 
a               2 
a               3 
b               1 
b               2 

$test | sort name; 
a               3 
a               2 
a               1 
b               2 
b               1 

$test | sort name -Desc; 
b               1 
b               2 
a               1 
a               2 
a               3 

$test | sort name | sort name; 
a               1 
a               2 
a               3 
b               1 
b               2 

$test | sort value | sort name; 
a               2 
a               1 
a               3 
b               1 
b               2 

$test | sort value; 
b               1 
a               1 
b               2 
a               2 
a               3 

. 동의하시면 upvote하십시오.