根据 属性 的值获取 Generic/List 中对象的索引

Get index of object in Generic/List based on value of a property

我可以用我的 class 实例填充 Generic.List,每个实例在 ID 属性 中都有一个唯一值,就像这样。

$packages = [System.Collections.Generic.List[object]]::New()

class Package {
    # Properties
    [String]$ID

    # Constructor
    Package ([String]$id) {
        $this.ID = $id
    }
}

foreach ($i in 65..90) {
    $packages.Add([Package]::New("$([char]$i)"))
}

现在我想获取特定项目的索引,按照 $packages.IndexOf('C') 的行。但是在 C# 中执行此操作似乎需要使用 lambda,而 PowerShell 似乎不支持它。我宁愿不必初始化我自己的索引变量并遍历列表中的所有项目,检查它们的 ID 并沿途递增索引。但是,也许这就是仅使用本机 PS cmdlet 的 PowerShell 与仅使用 C# 之间的灰色地带,在这两个极端中您都错过了糖分,必须自己制作?

您可以使用 [scriptblock] 作为谓词:

$packages.FindIndex({$args[0].ID -eq 'C'})
# or
$packages.FindIndex({param($item) $item.ID -eq 'C'})

假设您的包 ID 是唯一的,请考虑使用字典而不是列表:

$packages = [System.Collections.Generic.Dictionary[string,Package]]::new([StringComparer]::InvariantCultureIgnoreCase)

class Package {
    # Properties
    [String]$ID

    # Constructor
    Package ([String]$id) {
        $this.ID = $id
    }
}

foreach ($i in 65..90) {
    $ID = "$([char]$i)"
    $packages.Add($ID, [Package]::new($ID))
}

现在您不再需要担心项目的位置,现在您可以简单地通过 ID 删除一个项目:

$wasRemoved = $packages.Remove("C")

Remove() returns $true 成功删除条目时,$false 找不到密钥时