C#实现删除JSON文件中指定Passive成员的问题排查
问题根源
List<T>.Contains() 默认对引用类型使用引用相等判断对象是否存在。你从JSON反序列化得到的members数组对象,和搜索到的DokkanUserPassiveBuilder实例是不同内存对象——哪怕PassiveName完全一致,引用地址不同就会导致Contains返回false,无法触发删除。
解决方案
以下两种方法可直接解决问题,按需选择:
方法1:重写对象的相等判断逻辑
给DokkanUserPassiveBuilder类重写Equals和GetHashCode方法,让判断逻辑基于PassiveName(支持大小写不敏感匹配,可按需调整):
public class DokkanUserPassiveBuilder { public string PassiveName { get; set; } // 你的其他属性... public override bool Equals(object obj) { if (obj is not DokkanUserPassiveBuilder otherPassive) return false; // 基于PassiveName判断相等,OrdinalIgnoreCase支持大小写不敏感 return string.Equals(PassiveName, otherPassive.PassiveName, StringComparison.OrdinalIgnoreCase); } public override int GetHashCode() { // 对应Equals逻辑,哈希码基于PassiveName生成 return PassiveName?.GetHashCode(StringComparison.OrdinalIgnoreCase) ?? 0; } }
重写后,members.Contains(classObj)就能正确识别属性匹配的对象,执行删除操作。
方法2:直接通过属性匹配删除(更简洁)
无需修改类结构,直接用属性匹配删除:
批量删除(支持匹配多个相同PassiveName的条目)
// 用户传入的要删除的被动名称 string targetPassive = "TEQ Jiren"; // 删除所有PassiveName匹配的条目 int removedCount = members.RemoveAll(p => string.Equals(p.PassiveName, targetPassive, StringComparison.OrdinalIgnoreCase)); if (removedCount > 0) { // 将修改后的数组重新序列化并写入JSON文件 SaveUpdatedJson(members); // 告知用户删除成功(如Discord回复) } else { // 告知用户未找到匹配的被动技能 }
单个目标删除(适合PassiveName唯一的场景)
var passiveToDelete = members.FirstOrDefault(p => string.Equals(p.PassiveName, targetPassive, StringComparison.OrdinalIgnoreCase)); if (passiveToDelete != null) { members.Remove(passiveToDelete); SaveUpdatedJson(members); } else { // 未找到匹配项 }
关键注意点
- 推荐使用
StringComparison.OrdinalIgnoreCase做大小写不敏感匹配,避免用户输入大小写不一致导致匹配失败;若需精确匹配,替换为StringComparison.Ordinal即可。 - 删除操作完成后,必须将修改后的
members数组重新序列化并写入JSON文件,否则修改不会持久化。
内容的提问来源于stack exchange,提问作者user11057786
相关产品推荐
相关产品推荐

