2014-11-25 81 views
0

嘗試使用.remove從我的列表中刪除東西..但它不工作,給我的錯誤「參數類型'字符串'是不可分配給參數類型'System.Predicate'C#使用.Remove In List <Category>

public void ManiPulateCategory(string categoryToManipulate) 
    { 
     createCategories = repository.Load(path); 


     foreach (Category item in createCategories) 
     { 
      createCategories.Remove(item.CategoryName) 
      } 
     } 
+0

您需要在類型Category'的''一個方法Remove'對象作爲參數傳遞,而你是通過'串' – Fedor 2014-11-25 12:23:50

+1

這裏有幾個潛在的問題。 'Remove'方法將'T'作爲參數,在這種情況下是'Category'。但是你不能修改正在通過它的枚舉器迭代的列表,你會得到另一個錯誤。然後,'Remove'方法使用該類型的等式實現,或者如果找不到,則使用默認的等式實現。 – 2014-11-25 12:24:08

+0

foreach(創建分類中的分類項) { createCategories.Remove(item); } //不給我錯,但它沒有做我想做的事。 – DangerCoder 2014-11-25 12:26:37

回答

3

我認爲你正試圖從你的類別有CategoryName相匹配categoryToManipulate所有項目的列表中刪除

如果這是你想要的,你可以把它用List.RemoveAll()像這樣做:

createCategories.RemoveAll 
(
    catagory => catagory.CategoryName == categoryToManipulate 
); 

這是使用List上的方法,而不是來自IEnumerable的東西。如果你只有IEnumerable可用,你將不得不使用不同的解決方案 - 但你說你有一個List,所以這應該工作。

這個作品通過你通過所謂的謂詞RemoveAll()。謂詞只是一個方法,它接受某個類型的單個參數,並返回true或false。它將爲列表的每個元素調用一次,並將該元素作爲參數傳遞。如果它返回true,那麼該元素將被刪除。

在這種情況下,我沒有爲謂詞創建一個單獨的方法;相反,我寫了一個內聯lambda expression來實現它。

+0

謝謝,救了我的一天。 – DangerCoder 2014-11-25 12:28:26

+0

@DangerCoder如果你想欣賞某人,你可能想要使用標準的SO機制 - 比如接受一個答案和upvoting。 – Fedor 2014-11-25 12:41:10

0

爲了在列表中找到正確的項目,您必須覆蓋Object中的Equals和GetHashCode。

class Category { 
    public override bool Equals(object obj) 
    { 
     if (!(obj is Category)) return false; 
     return this.CategoryName == ((Category)obj).CategoryName; 
    } 

    public override int GetHashCode() 
    { 
     this.CategoryName.GetHashCodeU(); 
    } 
} 

現在你可以在你的循環中調用createCategories.remove(item)

+0

關於「現在你可以在你的循環中調用'createCategories.remove(item)':你不能同時列舉一個列表並從列表中移除項目,因爲你會得到'InvalidOperationException'。 – Grx70 2014-11-25 12:33:52

1
createCategories.RemoveAll(x=>x.CategoryName == categoryToManipulate) 

這樣的事情? (修正以反映的意見,但最初是由馬修·沃森上述建議)

也有看看這個Answer

+0

爲什麼選擇投票? – RabidDog5150 2014-11-25 12:36:21

+0

我沒有downvote,但由於集合被修改,此代碼將在循環中引發異常。即使它沒有拋出異常,它也會從集合中刪除所有項目。 – 2014-11-25 12:39:45

+0

足夠公平,我的答案是基於錯誤「」參數類型'字符串'不可分配給參數類型'System.Predicate'「。說明謂詞。也許我應該稍微詳細:) – RabidDog5150 2014-11-25 12:41:23

相關問題