5

2 つのコレクション (一般的なリスト) があります。それらを ListA と ListB と呼びましょう。

ListA にはタイプ A のアイテムがいくつかあります。ListB には、ListA のアイテムと同じ ID (ただしタイプは異なる) を持つタイプ B のアイテムがいくつかあります。ListA のアイテムと同じ ID を持つすべてのアイテムを ListB から削除したいと考えています。これを行う最善の方法は何ですか?オブジェクトへのLinqはうまく適合しますか? どのアルゴリズムを使用しますか?

ListA: ItemWithID1、ItemWithID2¨

ListB: ItemWithID1、ItemWithID2、ItemWithID3、ItemWithID4

編集: 元の質問で、 ListA と ListB に同じ型が含まれていないことを忘れていました。したがって、それらを比較する唯一の方法は、.Id プロパティを使用することです。これは、これまでに得た回答を無効にします。

4

6 に答える 6

12

ここに 2 つのオプションがあります。どちらが速いかはわかりません。

listB.RemoveAll(listA.Contains);


foreach (string str in listA.Intersect(listB))
  listB.Remove(str);
于 2008-10-28T19:06:29.557 に答える
3

ラムダ式が完全に一致することがわかりました。オブジェクト メソッドへの長い linq の代わりに、ラムダを使用してわずか数行で実行できます。

foreach(TypeA objectA in listA){
    listB.RemoveAll(objectB => objectB.Id == objectA.Id);
}
于 2008-11-04T15:16:16.613 に答える
1

最適な方法は Microserf の方法だと思います

上記の例のほとんどは、2 つのリストが同じタイプである状況を対象としています。しかし、異なるタイプの Id を比較して削除したい場合は、Microserf の方法が最適です。

ありがとう

于 2009-01-05T18:01:36.903 に答える
0

単純なループ:

for (item i: LISTA) {
    removeItem(i, LISTB);
}


method removeItem(Item, List) {
    for (Item i: List) {
        if (Item == i)
            List.removeItem(i);
    }
}
于 2008-10-28T19:01:09.117 に答える
0

それが最善の選択肢かどうかはわかりませんが、ListB にある ListA のすべての要素を削除する場合は、単純に ListA を反復処理し、if ListB.contains 構造を使用して ListB から削除します。

このようなもの

foreach Object o in ListA
  If ListB.contains(o)
    ListB.remove(o)
于 2008-10-28T19:01:53.623 に答える
0

C5 Generic Collection Library for .NET で利用できる参考資料はRemoveAll、Todd White が以前に指定したメソッドです。ただし、C5 はそのインターフェイスで別のメソッドも提供します。これは、元の作成者のリストを使用して、それとRetainAllは反対の機能を実行します。RemoveAll

ListB.RetainAll(ListA)はセット{ Item1, Item2 }ですListB.RemoveAll(ListA)が、 はセット{ Item3, Item4 }です。

于 2008-10-29T04:40:34.797 に答える