我正在 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++;
}
当我尝试删除它时,列表保持原样,不会删除任何内容。
最佳答案
您无法删除任何内容,因为 remElem
是 a
中的引用,但您从另一个列表中将其删除。即使对象具有相同的值,引用也是不同的。 cauldron.getElements()
中没有等于 remElem
的引用。
您应该编写一些查询来执行此操作:
cauldron.getElements().RemoveAll((e) => e.Id == remElem.Id); // or other field or fields
您应该在 cauldron.getElements()
中找到与 remElem
具有相同值的对象,然后从该列表中将其删除。
但它会删除所有元素。
要仅删除一个,您应该执行以下操作:
var list = cauldron.getElements();
foreach (Element remElem in a)
{
var elems = list.Where((e) => e.Id == remElem.Id);
if (elems.Any())
{
list.Remove(elems.ElementAt(0));
Debug.Log("Removed " + remElem + " from cauldron");
counter++;
}
}
关于c# - 无法从列表中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41764109/