我需要从多个来源创建一个独特的历史记录项列表,其中最新的项目是保留的项目。我正在尝试这样的事情,但由于问题领域,检查结果是否准确并不简单。
Function GetUnique {
param( $source1, $source2, ...)
$items = $source1 + $source2 + ...;
$unique = $items | Sort-Object -Desc -Unique -Prop Timestamp;
# Does this contain the most recent items?
$unique;
}
我很惊讶没有-Stable开关来表示偏好。
注意:我知道即使排序稳定,我也会对唯一性算法做出假设。如果排序是稳定的,我可以相对容易地编写我自己的稳定的Get-Unique命令行,它假定稳定的排序输入。但是,我真的不想实现MergeSort。
答案 0 :(得分:4)
因此,在抛弃我的场景之后,我发现了一个简单的测试,以证明排序实际上并不稳定但是以某种方式以稳定的方式反转序列。请注意,我使用的测试集非常小,因此这些结果可能是不确定的,但可以重现。
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;
结果如下:
$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
我已在https://connect.microsoft.com/PowerShell/feedback/details/752455/provide-stable-switch-for-sort-object-cmdlet向PS小组提交了有关此问题的建议。如果您同意,请提前投票。