如何高效遍历statsList匹配指定属性组合?支持优先级批量查询
高效实现游戏属性组合筛选方法
核心优化思路
手动多次调用FirstOrDefault会重复遍历集合,效率低下。改用HashSet预处理+LINQ延迟执行的方式,将属性查找从O(n)降到O(1),同时仅遍历数据源一次,大幅提升性能。
通用封装方法实现
假设你的数据模型是每个角色/条目包含一组属性(示例用CharacterStats类承载),以下是支持批量必填属性、带优先级可选组的LookUpForStats方法:
// 基础属性类 public class Stat { public string Name { get; set; } public int Value { get; set; } } // 承载一组属性的对象类 public class CharacterStats { public List<Stat> Stats { get; set; } = new List<Stat>(); } // 筛选方法实现 public static IEnumerable<CharacterStats> LookUpForStats( IEnumerable<CharacterStats> characterStatsList, IEnumerable<string> requiredStats, params IEnumerable<string>[] optionalStatGroups) { // 将必填属性转为HashSet,加速存在性检查 var requiredStatSet = new HashSet<string>(requiredStats, StringComparer.OrdinalIgnoreCase); // 预处理每个条目,提前提取属性名到HashSet,避免重复遍历属性列表 var preprocessedItems = characterStatsList.Select(item => new { Source = item, StatNames = new HashSet<string>(item.Stats.Select(s => s.Name), StringComparer.OrdinalIgnoreCase) }); foreach (var item in preprocessedItems) { // 检查是否包含所有必填属性 if (!requiredStatSet.IsSubsetOf(item.StatNames)) continue; // 按传入顺序检查可选组(优先级由传入顺序决定),匹配即停止 bool meetsOptionalRequirement = false; foreach (var group in optionalStatGroups) { if (group.Any(stat => item.StatNames.Contains(stat))) { meetsOptionalRequirement = true; break; } } if (meetsOptionalRequirement) yield return item.Source; } }
使用示例
针对你需求的筛选规则(必须包含stamina、agility、dodge,且包含max hp或defense其一),调用方式如下:
var filteredStats = LookUpForStats( statsList, new[] { "stamina", "agility", "dodge" }, new[] { "max hp", "defense" });
如果需要更复杂的优先级规则(比如优先匹配含max hp的条目,再匹配含defense+magic resistance的条目),可以传入多个可选组:
var prioritizedFilteredStats = LookUpForStats( statsList, new[] { "stamina", "agility", "dodge" }, new[] { "max hp" }, // 第一优先级:只要有max hp就符合 new[] { "defense", "magic resistance" }); // 第二优先级:满足其中一个才符合
效率说明
- 预处理一次:每个条目仅遍历一次属性列表,将属性名存入HashSet,后续所有检查均为O(1)时间复杂度。
- 避免重复遍历:相较于多次调用
FirstOrDefault反复扫描集合,该方法仅遍历数据源一次,性能提升显著。 - 优先级支持:可选组按传入顺序检查,匹配到高优先级组后立即停止后续判断,减少不必要的计算。
内容的提问来源于stack exchange,提问作者AdorableVB
相关产品推荐
相关产品推荐

