[英]Can't remove element from list
I'm developing a game in Unity, and I want to remove an element from a list. 我正在Unity中开发游戏,我想从列表中删除一个元素。 But when I call the method
List<T>.Remove(T)
, it doesn't remove anything. 但是,当我调用方法
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");
}
}
}
The problem comes in these lines: 问题出在以下几行:
foreach (Element remElem in a)
{
cauldron.getElements().Remove(remElem);
Debug.Log("Removed " + remElem + " from cauldron");
counter++;
}
When I try to delete it, the list stays as it, without deleting anything. 当我尝试删除它时,列表保持不变,但不删除任何内容。
You can't delete anything because remElem
is reference in a
but you delete it from another list. 您不能删除任何东西,因为
remElem
是参考a
但你从另一个列表中删除。 Even if objects has same values, the references are different. 即使对象具有相同的值,引用也不同。 There is no reference equal to
remElem
in cauldron.getElements()
. cauldron.getElements()
没有等于remElem
引用。
You should write some query to do it: 您应该编写一些查询来做到这一点:
cauldron.getElements().RemoveAll((e) => e.Id == remElem.Id); // or other field or fields
You should find object that has same values as remElem
in cauldron.getElements()
and then delete it from that list. 您应该在
cauldron.getElements()
找到与remElem
具有相同值的对象,然后从该列表remElem
其删除。
But it deletes all elements. 但是它将删除所有元素。
To delete only one you should do: 要仅删除一个,您应该执行以下操作:
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++;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.