You need to enable JavaScript to run this app. C# 8.0下如何实现无序多条件Switch分支匹配(Unity3D环境)
优惠活动
大模型
产品
解决方案
定价
更多

C# 8.0下如何实现无序多条件Switch分支匹配(Unity3D环境)

方案1:排序后匹配(推荐,性能最优)

你可以先把参与判断的3个枚举元素按固定规则排序,排序后相同的元素组合永远对应相同的顺序,仅需2个case即可覆盖所有无序匹配的场景。使用Span排序不会产生额外的堆内存分配,适配Unity高性能要求的场景:

// 取前3个元素做原地排序,无堆分配
var routeSpan = array.AsSpan(0, 3);
routeSpan.Sort();

switch (routeSpan[0], routeSpan[1], routeSpan[2])
{
    case (EntityRoute.North, EntityRoute.South, EntityRoute.West):
        prohibitedRoute = EntityRoute.East;
        return true;
    case (EntityRoute.North, EntityRoute.South, EntityRoute.East):
        prohibitedRoute = EntityRoute.West;
        return true;
}

方案2:集合匹配(扩展性更好)

如果后续判断逻辑可能调整元素数量,可以用HashSet做集合相等判断,天然支持无序匹配:

// 提前定义静态匹配集合,避免每次调用重复分配
private static readonly HashSet<EntityRoute> _eastProhibitSet = new()
{
    EntityRoute.North, EntityRoute.South, EntityRoute.West
};
private static readonly HashSet<EntityRoute> _westProhibitSet = new()
{
    EntityRoute.North, EntityRoute.South, EntityRoute.East
};

// 调用逻辑
var currentSet = new HashSet<EntityRoute>(array.Take(3));
if (currentSet.SetEquals(_eastProhibitSet))
{
    prohibitedRoute = EntityRoute.East;
    return true;
}
if (currentSet.SetEquals(_westProhibitSet))
{
    prohibitedRoute = EntityRoute.West;
    return true;
}

方案选择建议

  • 固定3个元素的判断逻辑优先选方案1,性能开销远低于方案2,适合每帧调用的移动逻辑等高频场景
  • 后续可能扩展判断元素数量选方案2,维护成本更低

内容的提问来源于stack exchange,提问作者Arcueid D'athemon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 03:30:04