2

文字列型のリストが2つあります。

  • List1にはアイテムがあります-item1、item2、item3
  • List2にはアイテムがあります-item2、item3

次に、両方のリストを比較して、重複したアイテムをから削除する必要がありますList1。変更List1には、「item1」という1つのアイテムのみが含まれている必要があります。

foreachループは機能する可能性がありますが、私が知りたいのは、これを行う組み込みのメソッドはありますか?

編集

答えてくれてありがとう。見逃したアイテムをリストに追加したいのならどうなるか考えていました。それで、これに似た別の質問を提起しました。

List<string>に操作を追加します

TIA!

4

4 に答える 4

10

あなたが使用することができます:

list1.RemoveAll(item => list2.Contains(item));

(マークが言うように、これはO(N * M)です。リストが非常に短いと予想される場合は問題ありませんが、いずれかが大きくなる可能性がある場合はひどいです。)

または、(既存のリストを変更するのではなく)新しいリストであることを気にしない場合は、次を使用できます。

list1 = list1.Except(list2).ToList();
于 2012-08-03T13:31:17.043 に答える
10

ここで使用する最善のアプローチは、最初に2番目のリストをハッシュに入れることだと思います。

var hash = new HashSet<TheType>(List2);
List1.RemoveAll(hash.Contains);

これにより、O(n * m)のパフォーマンスが回避され、代わりにO(n + m)になります。

例:

List<int> List1 = new List<int> {1,2,3};
List<int> List2 = new List<int> {2,3};

var hash = new HashSet<int>(List2);
List1.RemoveAll(hash.Contains);
// now List1 just has {1}
于 2012-08-03T13:31:22.317 に答える
3

使用する

List1 = List1.Except(List2).ToList();
于 2012-08-03T13:29:35.513 に答える
1

私は使用することをお勧めします:

List1 = List1.Except(List2).ToList();
于 2012-08-03T13:32:07.387 に答える