我正在Unity开发游戏,我想从列表中删除一个元素。但是当我调用方法List<T>.Remove(T)
时,它不会删除任何内容。
private void OnMouseDown()
{
Debug.Log("Clicked for mixing");
foreach (Element element in ElementsControl.elements)
{
if (element.composition.Length > 1)
{
Debug.Log("FINE. Element is not pure");
List<Element> a = new List<Element>();
foreach (Element compElement in element.getRawComposition())
{
a.Add(compElement);
}
string allComposition = "";
foreach (Element dispElement in a)
{
if (allComposition == "")
allComposition = dispElement.name;
else
allComposition += " + " + dispElement.name;
}
Debug.Log(element.name + " composition is: " + allComposition);
string cauldElements = "";
foreach (Element cauldElem in cauldron.getElements())
{
if (cauldElements == "")
cauldElements = cauldElem.name;
else
cauldElements += " + " + cauldElem.name;
}
Debug.Log("Cauldron has: " + cauldElements);
if (ContainsAllItems(cauldron.getElements(), a))
{
Debug.Log("OK. Mix result is " + element.name + ", used " + a);
Debug.Log("Removing " + a.Count + " elements from cauldron");
int counter = 0;
foreach (Element remElem in a)
{
cauldron.getElements().Remove(remElem);
Debug.Log("Removed " + remElem + " from cauldron");
counter++;
}
Debug.Log("Removed " + counter + " elements from cauldron");
Debug.Log("Adding " + element + " to cauldron");
cauldron.getElements().Add(element);
return;
}
else
Debug.Log("NO. Mix result not ok");
}
}
}
问题出在以下几行:
foreach (Element remElem in a)
{
cauldron.getElements().Remove(remElem);
Debug.Log("Removed " + remElem + " from cauldron");
counter++;
}
当我尝试删除它时,列表保持原样,不删除任何内容。
答案 0 :(得分:0)
您无法删除任何内容,因为axis
中的remElem
是引用,但您将其从其他列表中删除。即使对象具有相同的值,引用也是不同的。 a
中没有等同于remElem
的引用。
您应该编写一些查询来执行此操作:
cauldron.getElements()
您应该在cauldron.getElements().RemoveAll((e) => e.Id == remElem.Id); // or other field or fields
中找到与remElem
具有相同值的对象,然后将其从该列表中删除。
但它会删除所有元素。
只删除您应该执行的操作:
cauldron.getElements()