3

に問題がありDictionary(buzzCompaignsPerUserIntersets)ます。私は辞書(キー=文字列と値= 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));         
      }                
}

このコードでは、要素を削除する辞書を反復処理するため、奇妙な結果が得られます。

4

2 に答える 2

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);
         }
     }
}

AList<T>はそのメソッドを使用させますRemoveAll。それがどのように機能するかに興味がある場合は、別の質問に対する私の回答をご覧ください。

于 2012-07-06T19:09:37.297 に答える
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);
}
于 2012-07-06T16:48:30.847 に答える