powershell 从ArrayList中删除嵌套数组或PSCCustomObject

6xfqseft  于 2023-06-29  发布在  Shell
关注(0)|答案(1)|浏览(137)

我不明白为什么这不起作用,但我想知道这是怎么回事?
假设我有一个包含这些嵌套值的ArrayList:

[System.Collections.ArrayList]$al = @(@(0,1),@(1,2),@(3))

和另一个包含此值的数组:

$myObj = @(0,1)

为什么我不能用Remove()方法从$al中删除$myObj,即使$myObj包含在$al中?
$al.Remove($myObj)
谢谢!
我用简单的对象类型,比如int或string,做了这件事,它工作得很好。我认为这与数组相等有关,或者因为数组是引用类型...但如何才能实现删除呢?

fcg9iug3

fcg9iug31#

为什么我不能从$al中删除$myObj,即使$myObj包含在$al中,使用Remove()方法?
因为Arrays引用类型,而$myObj = @(0,1)不是$al@(0,1)的引用。
参见ArrayList.Remove(Object)上的备注
此方法通过调用Object.Equals来确定相等性。
并且,查看Object.Equals文档中的备注,我们可以看到以下内容:
如果当前示例是引用类型,则Equals(Object)方法测试引用相等性,并且对Equals(Object)方法的调用等效于对ReferenceEquals method的调用。引用相等意味着被比较的对象变量引用相同的对象。
例如,您可以尝试在$al中找到结构上与$myObj匹配的对象,然后从那里删除即可。

[System.Collections.ArrayList] $al = @(@(0, 1), @(1, 2), @(3))
$myObj = @(0, 1)
$toRemove = $al | Where-Object {
    [System.Linq.Enumerable]::SequenceEqual([int[]] $myObj, [int[]] $_)
}
$al.Remove($toRemove)

相关问题