gpt4 book ai didi

c# - 无法从列表中删除元素

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:44 24 4
gpt4 key购买 nike

我正在使用 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++;
}

当我尝试删除它时,列表保持原样,没有删除任何内容。

最佳答案

您不能删除任何内容,因为 remElema 中的引用,但您可以从另一个列表中删除它。即使对象具有相同的值,引用也是不同的。 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com