gpt4 book ai didi

arrays - 如果已存在,则防止将 pscustomobject 添加到数组

转载 作者:行者123 更新时间:2023-12-04 11:58:26 26 4
gpt4 key购买 nike

我觉得我无法弄清楚这一点很愚蠢,但是说我有一个包含 pscustomobjects 的数组。在一个令人难以置信的高层次上,请看下面的例子:

$arr = @()
$obj1 = [pscustomobject]@{prop1="bob";prop2="dude";prop3="awesome"}
$obj2 = [pscustomobject]@{prop1="bob";prop2="dude";prop3="awesome"}

$arr += $obj1
在这种情况下, $obj1 和 $obj2 具有完全相同的项目/属性。如何测试 $testarr 是否包含 $obj1 的属性以避免将 $obj2 添加到其中?
请注意,以上是一个粗略的例子。 pscustomobjects 正在从数据集动态创建并添加到数组中,但我想避免添加重复项。
我了解以下返回 true,但我完全希望任何给定的单个属性都有重复项。因此,我需要将整个 pscustomobject 和所有属性一起比较以获得唯一性。 $arr.Name -Contains 'Bob' #returns true附带问题......为什么 $obj1 和 $obj2 本身不被认为是平等的?我认为这是因为它们在技术上是不同的对象,只是具有相同的值,但我不明白为什么会这样,但是两个不同的变量只是一个字符串测试相同。
$obj1 -eq $obj2  #returns false
$str1 = "test"
$str2 = "test"
$str1 -eq $str2 #returns true

最佳答案

纯粹来自 MS Docs ,我离类专家还差得很远。

To create comparable classes, you need to implement System.IEquatable<T> in your class.

class customObject : System.IEquatable[Object] {
[string]$prop1
[string]$prop2
[string]$prop3

[bool]Equals([Object]$obj) {
return $this.prop1 -eq $obj.prop1 -and
$this.prop2 -eq $obj.prop2 -and
$this.prop3 -eq $obj.prop3
}
}

$x = [customobject]@{prop1="bob";prop2="dude";prop3="awesome"}
$y = [customobject]@{prop1="bob";prop2="dude";prop3="awesome"}

$i = [customobject]@{prop1="john";prop2="dude";prop3="awesome"}
$z = [customobject]@{prop2="bob"}

$x -eq $y # -> True
$x.Equals($y) # -> True
$x -eq $z # -> False
$x -eq $i # -> False

关于arrays - 如果已存在,则防止将 pscustomobject 添加到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68447494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com