2017-01-20 4 views
2

Ich entwickle ein Spiel in Unity, und ich möchte ein Element aus einer Liste entfernen. Aber wenn ich die Methode List<T>.Remove(T) aufrufen, wird nichts entfernt.Das Element kann nicht aus der Liste entfernt werden

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"); 
     } 
    } 
} 

Das Problem kommt in diesen Zeilen:

foreach (Element remElem in a) 
{ 
    cauldron.getElements().Remove(remElem); 
    Debug.Log("Removed " + remElem + " from cauldron"); 
    counter++; 
} 

Wenn ich versuche, es zu löschen, die Liste bleibt, wie es, ohne etwas zu löschen.

+0

Was Element ist? Haben Sie es debuggen und sichergestellt, dass das gleiche Element in der Liste vorhanden ist? –

+5

'cauldron.getElements()' erstellt wahrscheinlich eine neue Liste, die dann verworfen wird. – TaW

+0

Inn Ihren Code wird es nur in dem Fall entfernt werden, wenn 'remElem.Equals (compElement) == true' – Fabio

Antwort

0

Sie können nichts löschen, da remElem eine Referenz in a ist, aber Sie löschen es aus einer anderen Liste. Auch wenn Objekte die gleichen Werte haben, sind die Referenzen unterschiedlich. Es gibt keinen Verweis auf remElem in cauldron.getElements().

sollten Sie einige Abfrage schreiben, es zu tun:

cauldron.getElements().RemoveAll((e) => e.Id == remElem.Id); // or other field or fields 

Sie sollten Objekt finden, die gleichen Werte wie remElem in cauldron.getElements() hat, und löschen Sie sie dann aus dieser Liste.

Aber es löscht alle Elemente.

Um nur eine löschen Sie tun sollten:

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++; 
    } 
} 
+0

Ok, das löste es, aber es löscht alle übereinstimmenden Elemente in der Liste, und ich möchte nur 2 genannt Wasserstoff entfernen, und 1 nannte Sauerstoff, und wenn ich versuche, 2 Sauerstoff und 2 Wasserstoff hinzuzufügen, und ich rufe das Entfernen an, löscht es alle 4 Elemente, nicht die 3, die ich will. –

+0

Dies ist die Element-Klasse: –

+0

http://pastebin.com/urcZgb4H –

Verwandte Themen