gpt4 book ai didi

arrays - 检查值列表是否与其他列表中的值相同

转载 作者:行者123 更新时间:2023-12-02 01:24:35 25 4
gpt4 key购买 nike

我解析一个包含值的文本文件并收集列表中的各个值。如果有足够的字节,列表将以 Intel-HEX 格式发送到输出。我想隐藏所有值为 0xFF 的行。

为此,我定义了一个列表 $emptyline 并用所需的模式填充它。现在我想比较这两个列表。

$empty = (0xFF, 0xFF, 0xFF, 0xFF)
$values = (0xFF, 0xFF, 0xFF, 0xFF)

$values.Equals($empty)

令人惊讶的是最后一个表达式的结果为 False。如何检查所有值为 0xFF 的行?

最佳答案

tl;博士

  • 正确的数组比较:
$empty = (0xFF, 0xFF, 0xFF, 0xFF)
$values = (0xFF, 0xFF, 0xFF, 0xFF)

# -> $true
([Collections.IStructuralEquatable] $values).Equals(
$empty,
[Collections.Generic.EqualityComparer[int]]::Default
)

请参阅下一节的说明。

  • 通过字符串比较实现的实用快捷方式,它假设数组元素有意义且明确地进行字符串化(这里就是这种情况):<
# -> $true, i.e. the values are equal
"$values" -eq "$empty"

这依赖于 PowerShell 的内置数组(集合)字符串化,它将(字符串化)元素与空格连接起来(例如 "$(1, 2)" -> "1 2" )

  • 寻找非 0xFF 单个数组中的值:
# -> $true, i.e. all values are 0xFF
($values -ne 0xFF).Count -eq 0

这依赖于 PowerShell 的比较运算符,例如 -eq及其否定形式 -ne ,如果它们的 LHS 是一个数组(集合),则充当过滤器,即它们返回一个(新)匹配值的子数组


至于你尝试过的:

$values.Equals($empty)
Surprisingly the last expression results in False

您的.Equals调用bool Equals(System.Object obj)方法重载,它测试引用相等性,这意味着 $true仅当操作数引用完全相同的数组实例时才返回;例如:

# !! $false, because the two arrays - despite having the same(-valued) elements -
# !! are *different array instances*.
@(1, 2).Equals(@(1, 2))

但是,有一个 .Equals()执行您想要的操作的重载,即 System.Collections.IStructuralEquatable 提供的重载接口(interface),它有两个参数:

bool IStructuralEquatable.Equals(System.Object other, System.Collections.IEqualityComparer comparer)

使用该重载可以在默认 System.Collections.Generic.EqualityComparer<T> 的帮助下执行您想要的逐个元素比较,如上所示。实现 System.Collections.IEqualityComparer 的实例界面。


替代方案是使用 Compare-Object cmdlet,它非常灵活,如果需要的话,还可以让您识别两个数组之间的特定差异:

$empty = (0xFF, 0xFF, 0xFF, 0xFF)
$values = (0xFF, 0xFF, 0xFF, 0xFF)

# -> $true
-not (Compare-Object -SyncWindow 0 $empty $values | Select-Object -First 1)
  • Compare-Object默认情况下,仅返回输入数组(集合)之间不同的元素,因此任何输出的存在都意味着至少发现了一个差异。

  • -not隐式地将输出视为 [bool] ,基于 PowerShell 的隐式 to-Boolean 强制规则(请参阅 this answer 的底部部分),意味着 no 输出会产生 $false ,而 [pscustomobject]作为 Compare-Object 的输出产量$true .

  • -SyncWindow 0| Select-Object -First 1优化(对于小型数组可能不需要):

    • -SyncWindow 0确保只比较直接对应的元素;默认情况下,元素的顺序并不重要。这样可以更快地进行比较。
    • Select-Object -First 1停止处理一次 Compare-Object已找到第一个差异(如果有)。

关于arrays - 检查值列表是否与其他列表中的值相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75101271/

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