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
相关产品推荐
相关产品推荐

