PowerShell多数组随机选餐需求:每周需覆盖指定餐食类别
PowerShell 实现多分类周菜单生成方案
嘿,这个需求很实用!我来给你提供一个清晰的实现思路和可直接运行的代码,完美满足「每周至少含肉类、鱼类、蔬菜类各1份,剩余从主列表随机选取」的要求:
实现思路
- 先按分类定义不同的餐食集合(肉类、鱼类、蔬菜类),再合并出完整的主餐食列表
- 强制从每个必填分类中各抽取1份餐食,确保满足最低要求
- 从主列表中随机抽取剩余的餐食(排除已选过的,避免重复)
- 将所有选中的餐食与星期几对应,生成最终的周菜单
完整代码实现
# 定义各分类餐食列表 $meatDishes = @("黑椒牛排", "香煎猪排", "红烧牛腩", "奥尔良烤鸡") $fishDishes = @("清蒸鲈鱼", "香煎三文鱼", "红烧带鱼", "蒜蓉虾") $vegetarianDishes = @("清炒时蔬", "蒜蓉西兰花", "麻婆豆腐", "凉拌秋葵") # 合并为完整主餐食列表 $allDishes = $meatDishes + $fishDishes + $vegetarianDishes # 步骤1:从每个必填分类各选1份(确保不重复) $selectedMeat = $meatDishes | Get-Random -Count 1 $selectedFish = $fishDishes | Get-Random -Count 1 $selectedVeggie = $vegetarianDishes | Get-Random -Count 1 # 收集已选餐食,用于后续去重 $alreadySelected = @($selectedMeat, $selectedFish, $selectedVeggie) # 步骤2:从主列表中随机选取剩余4份(排除已选的) $remainingDishes = $allDishes | Where-Object { $_ -notin $alreadySelected } | Get-Random -Count 4 # 合并所有选中的餐食 $weeklyDishes = $alreadySelected + $remainingDishes # 步骤3:与星期几对应并输出周菜单 $weekDays = @("周一", "周二", "周三", "周四", "周五", "周六", "周日") for ($i = 0; $i -lt $weekDays.Count; $i++) { Write-Host "$($weekDays[$i]): $($weeklyDishes[$i])" }
代码关键点说明
- 分类独立定义:把不同类型的餐食分开维护,后续新增分类(比如健康餐、减脂餐)只需要添加新的数组即可,扩展性极强
- 强制保底选餐:通过单独抽取每个必填分类的餐食,严格满足「肉类、鱼类、蔬菜类各至少1份」的要求
- 自动去重逻辑:用
-notin过滤已选餐食,避免同一道菜出现在周菜单里 - 灵活的随机选取:剩余餐食从完整主列表中随机选,既保证多样性,又不限制只能从某一类选
如果需要更严谨的实现(比如用枚举来定义餐食分类),也可以把餐食定义为带分类属性的自定义对象,这样后续统计或筛选会更方便,比如:
# 用自定义对象定义带分类的餐食 $allDishes = @( [PSCustomObject]@{ Name = "黑椒牛排"; Category = "肉类" }, [PSCustomObject]@{ Name = "清蒸鲈鱼"; Category = "鱼类" }, [PSCustomObject]@{ Name = "清炒时蔬"; Category = "蔬菜类" }, [PSCustomObject]@{ Name = "香煎猪排"; Category = "肉类" }, [PSCustomObject]@{ Name = "蒜蓉西兰花"; Category = "蔬菜类" } # 可继续添加更多餐食... ) # 从每个分类选1份 $selectedFromMeat = $allDishes | Where-Object Category -eq "肉类" | Get-Random -Count 1 $selectedFromFish = $allDishes | Where-Object Category -eq "鱼类" | Get-Random -Count 1 $selectedFromVeggie = $allDishes | Where-Object Category -eq "蔬菜类" | Get-Random -Count 1 # 收集已选餐食名称用于去重 $alreadySelectedNames = @($selectedFromMeat.Name, $selectedFromFish.Name, $selectedFromVeggie.Name) # 选取剩余4份并提取名称 $remainingDishes = $allDishes | Where-Object { $_.Name -notin $alreadySelectedNames } | Get-Random -Count 4 | Select-Object -ExpandProperty Name # 合并并生成菜单 $weeklyDishes = @($selectedFromMeat.Name, $selectedFromFish.Name, $selectedFromVeggie.Name) + $remainingDishes $weekDays = @("周一", "周二", "周三", "周四", "周五", "周六", "周日") for ($i = 0; $i -lt $weekDays.Count; $i++) { Write-Host "$($weekDays[$i]): $($weeklyDishes[$i])" }
这种方式更适合餐食数量多、分类复杂的场景,维护和扩展起来更清晰。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

