我有几个场景,其中一系列任意字符串值具有特定的优先级序列。例如:
forgo > log > assert
exception > failure > error > warning > alert
并且,我需要评估任意数量的场景,这些场景解析到其中一个值并保持运行状态。因此,使用更简单的例子,如果每次求值都是assert
,那么最终运行状态将是assert
。但如果单个评价为log
,其余评价为assert
,则最终运行状态为log
。单个forgo
表示最终状态为forgo
,无论单个状态结果的混合是什么。我想提供一个人类可读的运行状态和个人状态,做数学来确定新的运行索引是什么,然后返回人类可读的状态。
所以,我有这个,它可以工作。
$statusIndex = @('assert', 'log', 'forgo')
$runningStatus = 'forgo'
$individualStatus = 'log'
$runningStatusIndex = $statusIndex.indexof($runningStatus)
$individualStatusIndex = $statusIndex.indexof($individualStatus)
if ($individualStatusIndex -gt $runningStatusIndex) {
$runningStatusIndex = $individualStatusIndex
}
$runningStatus = $statusIndex[$runningStatusIndex]
但是,这感觉像是经常发生的事情,可能会有更多的"本地"。就这么办。PowerShell内置的一些功能可以用更少的代码更优雅地处理同样的事情。
我的直觉是正确的,有一种自然的方法吗?或者,也许有一种比这里更优雅的方法?
将您的术语按优先顺序放入数组中:
$statusIndex = @('forgo', 'log', 'assert')
汇总所有状态值并删除任何重复值:
$statusValues = 'assert', 'assert', 'log', 'assert'
$statusValueSet = $statusValues |Sort -Unique
现在使用.Where()
扩展方法从优先级列表中只选择第一个匹配项:
$overallStatus = $statusIndex.Where({$_ -in $statusValueSet}, 'First')
$overallStatus
的值现在应该是'log'
了。
用3-4行代码代替9-10行:)