這種方法並不在所有的工作:無法刪除通過列表C#從數組的elment
public static void Delete(ref Prot[] pack, Prot prot)
{
var temp = new List<Prot>(pack);
temp.Remove(prot);
pack = temp.ToArray();
}
我在做什麼錯?
謝謝。
這種方法並不在所有的工作:無法刪除通過列表C#從數組的elment
public static void Delete(ref Prot[] pack, Prot prot)
{
var temp = new List<Prot>(pack);
temp.Remove(prot);
pack = temp.ToArray();
}
我在做什麼錯?
謝謝。
您的類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[]
參數。如果分配pack
到List<Prot>.ToArray()
然後它會從傳入數組中刪除英寸
public static void Delete(ref Prot[] pack, Prot prot)
{
var temp = new List<Prot>(pack);
temp.Remove(prot);
pack = temp.ToArray();
}
對不起,這只是拼寫錯誤。它仍然不起作用。 – user3149474
對我來說這似乎很奇怪。在那個對象中,我只有兩個int字段,所以如果它們與其他對象的相同字段相同,則默認情況下對象相等。或者不是? – user3149474
@ 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
你想達到什麼目的? – MarcinJuraszek
我假設你想''''數組被更新爲'prot'項目被刪除?編輯:如果是這樣,你忘了把它分配回'ref'參數:'pack = temp.ToArray();' –
你可能會覺得這個答案有幫助:http://stackoverflow.com/a/457501/4086 – Ferruccio