2014-02-12 106 views
0

我想從IList集合中刪除N個項目。這裏是我得到的:從IList中刪除匹配謂詞中的N個項目

public void RemoveSubcomponentsByTemplate(int templateID, int countToRemove) 
{ 
    // TaskDeviceSubcomponents is an IList 
    var subcomponents = TaskDeviceSubcomponents.Where(tds => tds.TemplateID == templateID).ToList(); 

    if (subcomponents.Count < countToRemove) 
    { 
     string message = string.Format("Attempted to remove more subcomponents than found. Found: {0}, attempted: {1}", subcomponents.Count, countToRemove); 
     throw new ApplicationException(message); 
    } 

    subcomponents.RemoveRange(0, countToRemove); 
} 

不幸的是,這段代碼並不像廣告中那樣工作。 TaskDeviceSubcomponents是一個IList,因此它沒有RemoveRange方法。所以,我調用.ToList()來實例化一個實際的List,但是這給了我一個重複的集合,引用了相同的集合項。這是不好的,因爲在子組件上調用RemoveRange不會影響TaskDeviceSubcomponents。

有沒有簡單的方法來實現這一點?我只是沒有看到它。

回答

2

不幸的是,我認爲你需要逐個刪除每個項目。我想你的代碼改成這樣:

public void RemoveSubcomponentsByTemplate(int templateID, int countToRemove) 
{ 
    // TaskDeviceSubcomponents is an IList 
    var subcomponents = TaskDeviceSubcomponents 
         .Where(tds => tds.TemplateID == templateID) 
         .Take(countToRemove) 
         .ToList(); 

    foreach (var item in subcomponents) 
    { 
     TaskDeviceSubcomponents.Remove(item); 
    } 
} 

注意,它使用ToList,你在這兒沒有迭代TaskDeviceSubcomponents同時消除一些項目是非常重要的。這是因爲LINQ使用懶惰評估,因此它不會迭代TaskDeviceSubcomponents,直到您遍歷​​。

編輯:我忽略了,只除去包含在countToRemove的項目數,所以我的Where後添加一個Take電話。

編輯2:規範取() - 方法:http://msdn.microsoft.com/en-us/library/bb503062(v=vs.110).aspx

+0

哦謝謝! .Take()真的有幫助。 :) –