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

如何高效遍历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" }); // 第二优先级:满足其中一个才符合

效率说明

  1. 预处理一次:每个条目仅遍历一次属性列表,将属性名存入HashSet,后续所有检查均为O(1)时间复杂度。
  2. 避免重复遍历:相较于多次调用FirstOrDefault反复扫描集合,该方法仅遍历数据源一次,性能提升显著。
  3. 优先级支持:可选组按传入顺序检查,匹配到高优先级组后立即停止后续判断,减少不必要的计算。

内容的提问来源于stack exchange,提问作者AdorableVB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:47:11