是否有一种简单的方法可以基于两个属性列的唯一组合来获取求和值?

时间:2019-01-22 18:28:55

标签: arrays powershell

我有一个对象数组,这些对象具有属性“ ID”,“代码”和“金额”。我需要获取一个对象数组,其中每个唯一的ID和代码对都具有Amount属性之和。例如,看起来如下的数组:

ID,Code,Amount
abc,123,10
abc,124,10
abc,123,20
def,124,20

应该最终看起来像这样:

ID,Code,Amount
abc,123,30
abc,124,10
def,124,20

顺序无关紧要。

我已经编写了执行此操作的代码,但是它很长,对于尝试执行的操作来说似乎不必要地复杂。代码如下:

  1. 获取所有唯一ID值和所有唯一Code值
  2. 遍历对象数组,如果以前没有看到ID和代码对,请将其添加到新数组中
  3. 如果以前已经看到过,它会将金额添加到先前添加到新数组中的对象。

相关代码可以在这里找到:

      #Get unique users
      $userArray = @()
      foreach($item in $resultsarray) {
          $alreadyInUserArray = $false
          foreach($user in $userArray) {
              if($user -like $item.'ID') {
                  $alreadyInUserArray = $true
              }
          }
          if ($alreadyInUserArray) {
          }
          else {
              $userArray += $item.'ID'
          }
      }

      #Get unique codes
      $codeArray = @()
      foreach($item in $resultsarray) {
          $alreadyInCodeArray = $false
          foreach($code in $codeArray) {
              if($code -like $item.'Code') {
                  $alreadyInCodeArray = $true
              }
          }
          if ($alreadyInCodeArray) {
          }
          else {
              $codeArray += $item.'Code'
          }
      }

      #Sum up entries by unique combination of user and code
      $cumulativeArray = @()
      foreach ($item in $resultsarray) {
          $alreadyInCumulativeArray = $false
          foreach($result in $cumulativeArray) {
              if(($item.'ID' -eq $result.'ID') -and ($item.'Code' -eq $result.'Code')) {
                  $alreadyInCumulativeArray = $true
                  $result.'Amount' += $item.'Amount'
              }
          }
          if ($alreadyInCumulativeArray) {

          }
          else {
              $cumulativeArray += $item
          }
      }

这对我来说是正确的,但是它涉及遍历数组很多次,这似乎效率很低。我正在寻找解决此问题的更好方法。

0 个答案:

没有答案