我正在匯入一個 csv 并有多個過濾器,最終用戶可以選擇這些過濾器來過濾 csv。
foreach 過濾器 Im = 到一個陣列。
我遇到的問題是 - 如果用戶選擇“中”和美元,他們應該只能看到來自影響列的“中”和來自國家/地區的美元的資料行。我的結果是從任何國家回傳“中等”和“美元”事件?
我覺得我這樣做是錯誤的。有任何想法嗎?感謝您的時間。
$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
}
uj5u.com熱心網友回復:
您的代碼構成了所有篩選結果的聯合,包括維度、影響和國家/地區(貨幣)。
相反,您需要來自這兩個維度的結果的交集。
直接的解決方法是收集沿第一個維度執行的過濾的中間結果,然后基于第二個維度進行過濾:
$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
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/399958.html
