2012-07-06 81 views
3

我有字典(buzzCompaignsPerUserIntersets)的問題,我有字典(key = stringand value = ICollection),我想從每個鍵的值中刪除,比較至極驗證條件這裏是代碼誰我用:從字典中刪除項目,同時迭代它

 buzzCompaignsPerUserIntersets = Dictionary<string, ICollection<Buzzcompaign> ; 

     foreach(var dic_compaign in buzzCompaignsPerUserIntersets) 
     { 

      var listCompaign = buzzCompaignsPerUserIntersets[dic_compaign.Key]; 
      for (int i = 0; i < listCompaign.Count(); i++) 
      { 
       if (listCompaign.ElementAt(i).MayaMembership.MayaProfile.MayaProfileId == profile_id) 
           buzzCompaignsPerUserIntersets[dic_compaign.Key].Remove(listCompaign.ElementAt(i));   
       }     
     } 

與此代碼我碰到了奇怪的結果,因爲我遍歷一個字典至極,我從他們刪除元素,你有什麼建議

回答

2

使用ElementAt(i)不是獲得特定項目的理想方法,而且表現不佳。它的用法表明你想要一個帶索引器的集合,比如IList<T>

使用當前的設置,你可以使用這種方法:

foreach(var key in buzzCompaignsPerUserIntersets.Keys) 
{ 
    var list = buzzCompaignsPerUserIntersets[key]; 
    var query = list.Where(o => o.MayaMembership 
            .MayaProfile.MayaProfileId == profile_id) 
        .ToArray(); 
    foreach (var item in query) 
    { 
     list.Remove(item); 
    } 
} 

或者,如果你能ICollection<T>更改爲IList<T>你可以使用索引和RemoveAt方法。這將是這樣的:

foreach(var key in buzzCompaignsPerUserIntersets.Keys) 
{ 
    var list = buzzCompaignsPerUserIntersets[key]; 
    for (int i = list.Count - 1; i >= 0; i--) 
    { 
     if (list[i].MayaMembership.MayaProfile.MayaProfileId == profile_id) 
     { 
      list.RemoveAt(i); 
     } 
    } 
} 

一個List<T>將讓您使用RemoveAll方法。如果你對這項工作感興趣,請看my answer to another question

+0

謝謝艾哈邁德先生,這一整天都在我身邊,這很有趣! – ucef 2012-07-06 19:33:46

0

嘗試這樣的事情

foreach(var dic_compaign in buzzCompaignsPerUserIntersets) 
{ 
    buzzCompaignsPerUserIntersets[dic_compaign.Key].RemoveAll(
    dic_campaign.Value.FindAll(
     delegate(ListCampaignType item) 
     { return item.MayaMembership.MayaProfile.MayaProfileId == profile_id; }) 
    ); 
} 

ListCampaignType是字典中值的類型。

基本上,你不能改變你正在迭代的一個集合,所以長期以來做的上面的方法是。

foreach(var dic_compaign in buzzCompaignsPerUserIntersets) 
{ 
    List<ListCampaignType> itemstoremove = new List<ListCampaignType>(); 
    foreach(var item in buzzCompaignsPerUserIntersets[dic_compaign.Key]) 
    { 
     if (item.MayaMembership.MayaProfile.MayaProfileId == profile_id) 
     { 
     itemstoremove.Add(item); 
     } 
    } 
    buzzCompaignsPerUserIntersets[dic_compaign.Key].RemoveAll(itemstoremove); 
} 
+0

ListCompaign是對象的列表,而不是對象,我嘗試第二個解決方案,但RemoveAll不被buzzCompaignsPerUserIntersets [dic_compaign.Key] – ucef 2012-07-06 17:08:45

+0

接受。剛注意到你已經將它定義爲ICollection。有什麼具體的原因嗎? – 2012-07-06 19:00:09