0

我有 2 个数组,每个数组有 2 个字段(例如“项目”和“价格”)。

以下是我的 1 个数组的 get-member 结果(实际上两个数组具有相同的结构)

   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition                    
----        ----------   ----------                    
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()             
GetType     Method       type GetType()                
ToString    Method       string ToString()             
item        NoteProperty System.String field1=computer 
price       NoteProperty System.String field2=2000     

我需要在数组 $shopA 中找到在数组 $shopB 中找不到的项目。我现在使用 2 个循环来查找丢失的项目。

$missing = @()
foreach ($itemA in $shopA) {
  $found = 0
  foreach ($itemB in $shopB) {
    if ($itemB.item -eq $itemA.item) {
      $found = 1
    }
  }
  if ($found = 0) {
    $missing += $itemA
  }
}

这种方法对我有用,但我的 2 个数组非常大,我想要一个比循环遍历整个数组更快的方法......

我一直在寻找一种更好的方法来做到这一点,并且 compare-object 几乎可以完成这项工作,但所有示例似乎都仅适用于一维数组。

谢谢

4

2 回答 2

1

从我所见,您确实有两个一维数组,尽管您声称相反。

寻找丢失物品的一种天真的方法是

$missing = $shopA | ? { $x = $_; !($shopB | ? {$_.item -eq $x.item})}

However, this will always be O(n²); to make it quicker you can collect all items from $shopB in a hastable first, which makes checking for existence O(1), not O(n):

$hash = @{}
$shopB | %{ $hash[$_.item] = 1 }
$missing = $shopA | ?{ !$hash.ContainsKey($_.item) }
于 2012-05-23T09:15:54.237 回答
0

像这样的东西?

 $shopA= @(1, 2, 3, 4)
 $shopB= @(4, 3, 5, 6)
 $shopB | where { $shopA -notcontains $_  }
于 2012-05-23T09:02:02.227 回答