You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell多数组随机选餐需求:每周需覆盖指定餐食类别

PowerShell 实现多分类周菜单生成方案

嘿,这个需求很实用!我来给你提供一个清晰的实现思路和可直接运行的代码,完美满足「每周至少含肉类、鱼类、蔬菜类各1份,剩余从主列表随机选取」的要求:

实现思路

  1. 先按分类定义不同的餐食集合(肉类、鱼类、蔬菜类),再合并出完整的主餐食列表
  2. 强制从每个必填分类中各抽取1份餐食,确保满足最低要求
  3. 从主列表中随机抽取剩余的餐食(排除已选过的,避免重复)
  4. 将所有选中的餐食与星期几对应,生成最终的周菜单

完整代码实现

# 定义各分类餐食列表
$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:03:16