2012-07-06 58 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

相关问题