C# List.Remove(项)的行为不符合预期
我正在使用Unity,并尝试使用字典键/值对从列表中删除重复项 问题: 运行代码时,如果存在重复项,则删除列表中的第一项,而不是特定项,如“list.Remove(item)”所示C# List.Remove(项)的行为不符合预期,c#,unity3d,C#,Unity3d,我正在使用Unity,并尝试使用字典键/值对从列表中删除重复项 问题: 运行代码时,如果存在重复项,则删除列表中的第一项,而不是特定项,如“list.Remove(item)”所示 publicstaticdictionary farmDict=newdictionary(); public static List farmBuildingsList=new List(); 公共静态void UpdateList(列表列表、字典目录、字符串ID、T resBuilding),其中T:Resour
publicstaticdictionary farmDict=newdictionary();
public static List farmBuildingsList=new List();
公共静态void UpdateList(列表列表、字典目录、字符串ID、T resBuilding),其中T:ResourceBuildings,new()
{
T obj=新的T()
{
ID=resBuilding.ID,
hourlyIncome=resBuilding.hourlyIncome,
baseHour=resBuilding.baseHour,
incomeIncrement=resBuilding.incomeIncrement,
totalSupply=resBuilding.totalSupply
};
if(dict.ContainsKey(ID))
{
dict[ID]=obj;
删除(dict[ID]);
列表。添加(dict[ID]);
}
其他的
{
dict.Add(obj.ID,obj);
列表。添加(obj);
}
}
使用if语句中的Debug.Logs,dict[ID]
为null,但dict[ID].ID(以及所有属性)包含正确的值,因此整个内容都不是null。我不确定这是否是问题所在,但我已要求在gamedev.stackexchange中修复Object.name
我读过关于使用Linq和HashSet删除重复项的更合适的方法(以及其他stackoverflow帖子),但我不知道如何重写Equals和HashCode函数。简短回答
旁注:dict[key]=value
足以使用指定的键创建新元素或更新现有元素(请参见),因此整个if(dict.ContainsKey(ID))
毫无意义
扩展答案 也许这是一个错误,而您当前的方法可能隐藏了您真正需要解决的问题(可能:)。简短回答 旁注:
dict[key]=value
足以使用指定的键创建新元素或更新现有元素(请参见),因此整个if(dict.ContainsKey(ID))
毫无意义
扩展答案
也许这是一个错误,而您当前的方法可能隐藏了要解决的真正问题(可能是:)。当您在
列表上调用Remove
时,应该会发生这种情况。文档甚至明确指出:“从(T的)列表中删除特定对象的第一次出现”。您需要找到该项的索引,然后调用RemoveAt
。您可以尝试从字典的Keys
集合中获取键的索引,但这不是IList
,因此它没有IndexOf
方法,我不确定您是否会得到一致的排序。在我看来,您应该干脆完全取消列表
,只需调用ToList
或ToArray
列在字典
的值
集合上,当您特别需要时。您是否应该呼叫列表。在更改dict[ID]之前删除?您正在尝试删除刚刚创建的实例,而不是旧实例。新实例不可能已经在列表中。。。我假设ResourceBuildings是一个类,因为您已经说过它可以为空。请以不同的方式执行。在字典中,将int作为索引存储到列表中。这正是在列表中调用Remove
时应该发生的情况。文档甚至明确指出:“从(T的)列表中删除特定对象的第一次出现”。您需要找到该项的索引,然后调用RemoveAt
。您可以尝试从字典的Keys
集合中获取键的索引,但这不是IList
,因此它没有IndexOf
方法,我不确定您是否会得到一致的排序。在我看来,您应该干脆完全取消列表
,只需调用ToList
或ToArray
列在字典
的值
集合上,当您特别需要时。您是否应该呼叫列表。在更改dict[ID]之前删除?您正在尝试删除刚刚创建的实例,而不是旧实例。新实例不可能已经在列表中。。。我假设ResourceBuildings是一个类,因为您已经说过它可以为空。请以不同的方式执行。在字典中,将int作为索引存储到列表中。
public static Dictionary<string, Farm> farmDict = new Dictionary<string, Farm>();
public static List<Farm> farmBuildingsList = new List<Farm>();
public static void UpdateList<T>(List<T> list, Dictionary<string, T> dict, string ID, T resBuilding) where T : ResourceBuildings, new()
{
T obj = new T()
{
ID = resBuilding.ID,
hourlyIncome = resBuilding.hourlyIncome,
baseHour = resBuilding.baseHour,
incomeIncrement = resBuilding.incomeIncrement,
totalSupply = resBuilding.totalSupply
};
if (dict.ContainsKey(ID))
{
dict[ID] = obj;
list.Remove(dict[ID]);
list.Add(dict[ID]);
}
else
{
dict.Add(obj.ID, obj);
list.Add(obj);
}
}
dict[ID] = new T
{
ID = resBuilding.ID,
hourlyIncome = resBuilding.hourlyIncome,
baseHour = resBuilding.baseHour,
incomeIncrement = resBuilding.incomeIncrement,
totalSupply = resBuilding.totalSupply
};
list.RemoveAll(item => item.ID == ID);
list.Add(dict[ID]);