将数组与 null 元素进行比较

Compare array with null elements

我有两个数组有超过 500,000 个值,需要进行比较以找出差异。数组中的某些值是 $null。当我尝试执行以下代码时出现错误 Compare-Object : Cannot bind argument to parameter 'ReferenceObject' because it is null

是否有任何解决此问题的方法,或者是否有更好更快的方法来找出差异?我只对 variance/difference.

的计数感兴趣

谢谢!

示例代码:

$objSource = @('a', $null, 'c')
$objTarget = @('a', 'b','c')
Compare-Object -ReferenceObject $objSource -DifferenceObject $objTarget | Measure

错误信息:

Compare-Object : Cannot bind argument to parameter 'ReferenceObject' because it is null . At line:4 char:32
+ Compare-Object -ReferenceObject <<<<  $objSource -DifferenceObject $objTarget
    + CategoryInfo          : InvalidData: (:) [Compare-Object], ParameterBindingValid     ationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft     .PowerShell.Commands.CompareObjectCommand

documentation 声明如果 -ReferenceObject-DifferenceObject$null 就会发生这种情况,但如果这些对象的任何元素是,则不会真正涵盖。

NOTE: If the reference set or the difference set is null ($null), Compare-Object generates a terminating error.

快速解决方法是用控制字符或类似的东西替换那些 $null 元素。

$objSource = @('a', $null, 'c') -replace "^$","null"
$objTarget = @('a', 'b','c') -replace "^$","null"
Compare-Object -ReferenceObject $objSource -DifferenceObject $objTarget

-replace 将从字符串 "null" 的数组中删除那些空条目。所以我们现在可以直观地了解该数据。该文本不太可能是自然元素,但您仍然必须保持警惕。如果 null 不合适,我会推荐百吉饼作为关键字!

这似乎有效:

$objSource = @('a', $null, 'c')
$objTarget = @('a', 'b','c')
Compare-Object -ReferenceObject ([string[]]$objSource) -DifferenceObject ([string[]]$objTarget) | Measure