6

コードを考えると:

var AllItems = new List<CartItem>();

using(var db = new MainContext())
{
    foreach (var item in AllItems)
    {
        if (!db.tblStoreItems.Where(i => i.ID == item.ItemID).Any())
        {
            AllItems.Remove(item);
        }
    }
}

これは、ループ内の List オブジェクトからアイテムを削除する最良の方法ですか?

4

3 に答える 3

9

私はそうは思わない。反復しているリストからアイテムを削除すると、結果は確実に間違ったものになります。

古い方法のforを使用するのが最善です-逆の順序でループします

using(var db = new MainContext()) 
{ 
    for(int x = AllItems.Count - 1; x >= 0; x--) 
    { 
        var item = AllItems[x];
        if (!db.tblStoreItems.Where(i => i.ID == item.ItemID).Any()) 
        { 
            AllItems.RemoveAt(x); 
        } 
    } 
}
于 2012-04-14T12:39:34.180 に答える
7

ループ アプローチにはいくつか問題があります。主な問題は、現在繰り返し処理しているコレクションからアイテムを削除できないことですforeach。例外が発生します。

メイン コレクションは であるため、述語を受け取るメソッドをList<T>使用する必要があります。RemoveAllまた、次のようにクエリを簡素化する必要があります。

AllItems.RemoveAll(item => !db.tblStoreItems.Any(i => i.ID == item.ItemID));
于 2012-04-14T12:46:13.163 に答える
1

スティーブが正しく示唆しているように、それは間違っています(OPのアプローチ)(スティーブの方法はおそらくパフォーマンスの点で最高です)、

私は別のリストに保存することを好み'those to be removed'ます、そしてあなたは例えばすることができます

AllItems = AllItems.Except(Items2Remove);  

これはパフォーマンスの観点からは最善ではありませんが、私にとっては物事をよりクリーンにします-LINQ列挙と組み合わせることができます-たとえば、レコードのリストからIEnumerableを作成します。

これが編集に役立つことを願っています:スティーブの応答に従って明確にするためだけに

于 2012-04-14T12:43:33.987 に答える