我尝试从包含重复项的数组中删除对象,并且只保留TasteCode
中编号最大的对象。下面的示例是高度简化的,但它显示了问题。
示例:
$Fruits
Name | Color | TasteCode
----- ------ ---------
Apple | Red | 2
Apple | Red | 3
Peer | Green | 0
Banana | Yellow | 1
Banana | Yellow | 0
Banana | Yellow | 3
所需解决方案:
Name | Color | TasteCode
----- ------ ---------
Apple | Red | 3
Peer | Green | 0
Banana | Yellow | 3
我已经成功收集了那些需要删除的内容,但它并没有很好地解决这个问题:
$DuplicateMembers = $Fruits | Group-Object Name | Where Count -GE 2
$DuplicateMembers | ForEach-Object {
$Remove = $_.Group | Sort-Object TasteCode | Select -First ($_.Group.Count -1)
$Fruits = Foreach ($F in $Fruits) {
Foreach ($R in $Remove) {
if (($F.Name -ne $R.Name) -and ($F.TasteCode -ne $R.TasteCode)) {
$F
}
}
}
}
感谢您的帮助。
答案 0 :(得分:1)
如何不执行删除操作,只是按tastecode
降序排序并仅获取一个第一个结果?
$DuplicateMembers = $Fruits | Group-Object Name
$DuplicateMembers | ForEach-Object {
$Outcome = $_.Group | Sort-Object TasteCode -descending | Select -First 1
$Outcome
}
这样您就不必费心去除此查询结果中的任何内容。
答案 1 :(得分:1)
按TasteCode对水果进行排序,按名称分组并选择每组中的前1个:
$result = $Fruits | sort TasteCode -Descending | group Name | % { $_.Group | select -first 1}