C# Can';t从列表中删除元素
我正在Unity中开发一个游戏,我想从列表中删除一个元素。但是当我调用List.Remove(T)方法时,它不会删除任何内容C# Can';t从列表中删除元素,c#,unity3d,C#,Unity3d,我正在Unity中开发一个游戏,我想从列表中删除一个元素。但是当我调用List.Remove(T)方法时,它不会删除任何内容 private void OnMouseDown() { Debug.Log("Clicked for mixing"); foreach (Element element in ElementsControl.elements) { if (element.composition.Length > 1) {
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");
}
}
}
当我试图删除它时,列表保持原样,不删除任何内容。您不能删除任何内容,因为
remElem
在a
中是引用,但您将其从另一个列表中删除。即使对象具有相同的值,引用也不同。cauldron.getElements()
中没有与remElem
相等的引用
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");
}
}
}
您应该编写一些查询来执行此操作:
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++;
}
}
什么是元素?您是否调试过它并确保列表中存在相同的元素?
cauldron.getElements()
可能会创建一个新的列表,然后将其丢弃。在您的代码中,只有当remElem.Equals(compElement)==true时,才会删除该列表,这解决了该问题,但它会删除列表中所有匹配的元素,并且,我只想移除2个氢元素,1个氧元素,当我尝试添加2个氧元素和2个氢元素时,我调用移除,它会删除所有4个元素,而不是我想要的3个元素。这是元素类: