用于从Array中删除对象的PowerShell逻辑

时间:2015-06-15 13:03:08

标签: arrays powershell

我尝试从包含重复项的数组中删除对象,并且只保留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
            }
        }
    }
}

感谢您的帮助。

2 个答案:

答案 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}