2014-01-08 57 views
0

這種方法並不在所有的工作:無法刪除通過列表C#從數組的elment

public static void Delete(ref Prot[] pack, Prot prot) 
    { 
     var temp = new List<Prot>(pack); 
     temp.Remove(prot); 
     pack = temp.ToArray(); 
    } 

我在做什麼錯?

謝謝。

+0

你想達到什麼目的? – MarcinJuraszek

+0

我假設你想''''數組被更新爲'prot'項目被刪除?編輯:如果是這樣,你忘了把它分配回'ref'參數:'pack = temp.ToArray();' –

+0

你可能會覺得這個答案有幫助:http://stackoverflow.com/a/457501/4086 – Ferruccio

回答

4

您的類Prot需要覆蓋Object.Equals()方法。這是List<T>.Remove的工作原理。從文檔:

如果類型T實現IEquatable<T>通用接口,該相等比較器是該接口的Equals方法;否則,默認的相等比較器是Object.Equals

如果您不覆蓋Object.Equals它將只使用默認實現來檢查引用相等性,而不是值相等性。

因此,temp.Remove(prot);永遠不會刪除任何值。 (這可以基於Remove返回值來驗證它返回true如果它成功地刪除一個值,false否則

這裏有一個基本的例子:。http://ideone.com/vOZoYI


最初的回答(問題是一個有關錯字)。

您正在修改一個新的對象,一個List<Prot>,而不是Prot[]參數。如果分配packList<Prot>.ToArray()然後它會從傳入數組中刪除英寸

public static void Delete(ref Prot[] pack, Prot prot) 
{ 
    var temp = new List<Prot>(pack); 
    temp.Remove(prot); 
    pack = temp.ToArray(); 
} 
+0

對不起,這只是拼寫錯誤。它仍然不起作用。 – user3149474

+0

對我來說這似乎很奇怪。在那個對象中,我只有兩個int字段,所以如果它們與其他對象的相同字段相同,則默認情況下對象相等。或者不是? – user3149474

+0

@ user3149474否。默認的'Equals'實現是引用相等,也就是說,雙方都引用同一個對象。 '對象a,b; a = new Object(); b = a; // a.Equals(b) - > true'但是'a = new Object(); b = new Object(); // a.Equals(b) - > false',因爲'a'和'b'指的是不同的對象。 – clcto