比较两个列表/数组并索引差异的位置

时间:2017-06-26 18:22:04

标签: arrays powershell

我能够与数组进行比较并获得元素的索引,但这种内置的Compare-Object函数返回一个奇怪的值。当我运行此代码时,它返回值-1。

  1. How to compare two arrays are described here
  2. Get index of current item in powershell
  3. 这是我的代码。

    # compare to arrays
    
    $array1 = @(1,2,3,4,5)
    $array2 = @(1,2,7,4,5)
    
    $difference = Compare-Object $array1 $array2
    
    # get the position of the difference in arrays
    [array]::IndexOf($array1, $difference)
    [array]::IndexOf($array2, $difference)
    

    结果

    PS C:\...\2017-06-25> C:\...\2017-06-25\compareArrays.ps1
    -1
    -1
    

    我将使用它来读取文件并进行比较,并告诉我文件中的差异在哪里。

2 个答案:

答案 0 :(得分:1)

问题是Compare-Object的输出与您在IndexOf()中的使用方式不符。

Compare-Object $array1 $array2

InputObject SideIndicator
----------- -------------
          7 =>
          3 <=

所以你要找的是将它分成两个独立的数组。一个只匹配左侧,一个匹配右侧。将Where方法与Split一起使用可以轻松实现。

$RightDiffs,$LeftDiffs = $difference.where({$_.SideIndicator -eq "=>"},'Split')

在您的示例中,每个中只有一个不同,但可能每个都有多个对象,因此我们需要遍历每个对象。我们只想要InputObject属性。

foreach ($LeftDiff in $LeftDiffs.InputObject) {
    [array]::IndexOf($array1, $LeftDiff )
}
foreach ($RightDiff in $RightDiffs.InputObject) {
    [array]::IndexOf($array2, $RightDiff)
}

答案 1 :(得分:1)

也许像

function Compare-Array {
  param(
    [Array] $array1,
    [Array] $array2
  )
  if ( -not (Compare-Object $array1 $array2) ) {
    return -1
  }
  for ( $i = 0; $i -lt $array1.Count; $i++ ) {
    if ( $array1[$i] -eq $array2[$i] ) {
      return $i
    }
  }
  return $array1.Length
}

如果数组相等则返回-1,或者两者之间的第一个差异的索引。