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

C#中如何仅更新列表单个元素而非全部?游戏装备问题求助

问题分析

你遇到的核心问题是代码没有准确定位到传入的那个Item实例,而是每次都取对应物品列表的第一个元素进行修改,导致看起来像是修改了所有元素(若列表内多个Item为同一实例,也会触发该问题,但更常见的原因是定位逻辑错误)。

具体来说,这两行代码是问题根源:

GameManagerSingleton.Instance.PlayerData.itemsInventory.FirstOrDefault(x => x.Key == item.AssetName && x.Value.Any(x => x.isEquiped == false)).Value.FirstOrDefault().isEquiped = true;
GameManagerSingleton.Instance.PlayerData.itemsInventory.FirstOrDefault(x => x.Key == item.AssetName && x.Value.Any(x => x.isEquiped == true)).Value.FirstOrDefault().isEquiped = false;
  • x.Value.Any(...)仅判断列表中是否存在符合条件的元素,并未定位到要操作的目标Item
  • .Value.FirstOrDefault()直接取列表第一个元素,而非你传入的item实例
修复方案

1. 准确定位目标Item实例

Item是引用类型,可直接在对应物品列表中查找该实例,同时增加空值判断避免空引用异常:

修改后的完整方法:

Dictionary<string, List<Item>> itemsInventory;

public void EquipWeapon(bool tog, Item item)
{
    // 先获取对应物品的列表,避免重复查找
    if (!GameManagerSingleton.Instance.PlayerData.itemsInventory.TryGetValue(item.AssetName, out var itemList))
    {
        // 找不到该物品,直接返回
        return;
    }

    if (tog)
    {
        if (!player.weapon)
        {
            player.GetStatByName(item.StatAffectedName).AddModifier(item.StatAffectedValue, StatModifier.ModifierOrigins.Equipment, StatModifier.ModifierType.Flat, item.AssetName);
            
            // 定位到传入的未装备Item并设置状态
            var targetItem = itemList.FirstOrDefault(i => ReferenceEquals(i, item) && !i.isEquiped);
            if (targetItem != null)
            {
                targetItem.isEquiped = true;
                player.weapon = true; // 原代码遗漏了设置player.weapon为true的逻辑
            }
        }
    }
    else
    {
        if (player.weapon)
        {
            player.GetStatByName(item.StatAffectedName).RemoveModifier(item.AssetName);
            
            // 定位到传入的已装备Item并设置状态
            var targetItem = itemList.FirstOrDefault(i => ReferenceEquals(i, item) && i.isEquiped);
            if (targetItem != null)
            {
                targetItem.isEquiped = false;
            }
            player.weapon = false;
        }
    }
    
    player.GetStatByName(item.StatAffectedName).GetValue();
}

2. 额外优化建议

  • 给Item类添加唯一标识字段(如Guid Id),若Item是克隆实例,可用i.Id == item.Id替代ReferenceEquals(i, item)进行定位
  • 增加调试日志,方便排查是否成功找到目标Item
  • 封装背包操作工具类,减少重复的字典查找逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:36:28