CSV 多重过滤器

CSV multiple filters

我正在导入一个 csv 并有多个过滤器,最终用户可以 select 来过滤 csv。

foreach 过滤器 Im += 到一个数组。
我 运行 的问题是- 如果用户 selects 'Medium' 和美元,他们应该只能看到同时具有来自影响列的 'Medium' 和来自国家/地区的美元的数据行。 我的结果返回 'Medium' 来自任何国家和 'USD' 个事件?

我觉得我走错了路。有任何想法吗? 谢谢你的时间。

$buttonFilter_Click={
    
    $r = @()
    #Filter Impact Column#
    if ($checkboxLow.Checked -eq $true)
    {
        $r += $script:WorldWideNews | ? { $_.Impact -eq 'Low' }
    }
    
    if ($checkboxMedium.Checked -eq $true)
    {
        $r += $script:WorldWideNews | ? { $_.Impact -eq 'Medium' }
    }
    if ($checkboxHigh.Checked -eq $true)
    {
        $r += $script:WorldWideNews | ? { $_.Impact -eq 'High' }
    }
    

    #Filter Country column#
    if ($checkboxUSD.Checked -eq $true)
    {
        $r += $script:WorldWideNews | ? { $_.Country -eq 'USD' }    
    }
    
    if ($checkboxCHF.Checked -eq $true)
    {
        $r += $script:WorldWideNews | ? { $_.Country -eq 'CHF' }
    
    }
    if ($checkboxGBP.Checked -eq $true)
    {
        $r += $script:WorldWideNews | ? { $_.Country -eq 'GBP' }
        
    }
    if ($checkboxAUD.Checked -eq $true)
    {
        $r += $script:WorldWideNews | ? { $_.Country -eq 'AUD' }
    }
    
    if ($checkboxCNY.Checked -eq $true)
    {
        $r += $script:WorldWideNews | ? { $_.Country -eq 'CNY' }
        
    }
    if ($checkboxJPY.Checked -eq $true)
    {
        $r += $script:WorldWideNews | ? { $_.Country -eq 'JPY' }
        
    }
    if ($checkboxCAD.Checked -eq $true)
    {
        $r += $script:WorldWideNews | ? { $_.Country -eq 'CAD' }
    }
    
    if ($checkboxEUR.Checked -eq $true)
    {
        $r += $script:WorldWideNews | ? { $_.Country -eq 'EUR' }
        
    }
    if ($checkboxNZD.Checked -eq $true)
    {
        $r += $script:WorldWideNews | ? { $_.Country -eq 'NZD' }
        
    }
    
    $table = ConvertTo-DataTable -InputObject $r
    Update-DataGridView -DataGridView $datagridviewUpcomingNews -Item $table
    
}

您的代码形成 所有 过滤结果的并集,沿两个 维度,影响和国家(货币)。

相反,您需要这两个维度的结果交集

直接解决方法是收集沿第一个维度执行的过滤的中间结果,然后基于该中间结果沿第二个维度进行过滤:

  $r = @()

  #Filter Impact Column#
  if ($checkboxLow.Checked)
  {
      $r += $script:WorldWideNews | ? { $_.Impact -eq 'Low' }
  }
  # ...


  # Save the results of the impact filtering
  # and base all subsequent filtering on that.
  $impactFilterResults = $r
  $r = @()

  #Filter Country column# - note the use of $impactFilterResults as input.
  if ($checkboxUSD.Checked)
  {
      $r += $impactFilterResults | ? { $_.Country -eq 'USD' }
  }
  if ($checkboxCHF.Checked)
  {
      $r += $impactFilterResults | ? { $_.Country -eq 'CHF' }
  }
  # ...

但是请注意,您的代码可以简化,方法是最终将所有过滤器组合成一个 单个 Where-Object (?) 调用 可以执行:

$buttonFilter_Click = {
  
  # Map the checkboxes to the corresponding values to filter by.
  $impactValueMap = @{
    $checkboxLow    = 'Low'
    $checkboxMedium = 'Medium'
    $checkboxHigh   = 'High'
  }

  # Based on which are checked, determine the list of values to filter by.
  [array] $impactsToFilterBy = foreach ($checkbox in $checkboxLow, $checkboxMedium, $checkboxHigh) {
    if ($checkbox.Checked) { $impactValueMap[$checkbox] }
  }

  # Note: Truncated to 3 entries for brevity
  $countryValueMap = @{
    $checkboxUSD = 'USD'
    $checkboxCHF = 'CHF'
    $checkboxGBP = 'GBP'
    # ...
  }

  [array] $countriesToFilterBy = foreach ($checkbox in $checkboxUSD, $checkboxCHF, $checkboxGBP) {
    if ($checkbox.Checked) { $countryValueMap[$checkbox] }
  }

  # Use a single Where-Object call to filter, based
  # on *arrays* of values to match.
  $r = 
    $script:WorldWideNews |
      Where-Object { $_.Impact -in $impactsToFilterBy -and $_.Country -in $countriesToFilterBy }

  $table = ConvertTo-DataTable -InputObject $r
  Update-DataGridView -DataGridView $datagridviewUpcomingNews -Item $table

}