Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# List.Remove(项)的行为不符合预期_C#_Unity3d - Fatal编程技术网

C# List.Remove(项)的行为不符合预期

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

我正在使用Unity,并尝试使用字典键/值对从列表中删除重复项

问题: 运行代码时,如果存在重复项,则删除列表中的第一项,而不是特定项,如“list.Remove(item)”所示

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]);