2017-01-20 13 views
2

私は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++; 
} 

私はそれを削除しようとすると、リストには何も削除せず、それととどまります。

+0

要素は何ですか?それをデバッグして、同じ要素がリストに存在することを確認しましたか? –

+5

'cauldron.getElements()'はおそらく新しいリストを作成し、それを破棄します。 – TaW

+0

あなたのコードは 'remElem.Equals(compElement)== true 'の場合にのみ削除されます。 – Fabio

答えて

0

remElemaの参照ですが、別のリストから削除するため、何も削除できません。たとえオブジェクトの値が同じであっても、参照は異なります。 の参照はcauldron.getElements()にありません。

あなたはそれを行うには、いくつかのクエリを記述する必要があります

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

これで解決しましたがリスト内のすべての要素が削除され、 1つは酸素と呼ばれ、2つの酸素と2つの水素を加えようとすると、それを取り除くと、それは4つの要素すべてを削除し、3つは削除しません。 –

+0

これは要素クラスです –

+0

http://pastebin.com/urcZgb4H –

関連する問題