foreachで回すのも一致したらlist.Remove というのも試したりしていますが、同じような結果になってしまって、分からなくなってしまいます。
Remove
は最初に出現したものいっこだけ削除のはずですが、逆にどういうコードを書いているんでしょうか?
List<T>.Remove(T) メソッド (System.Collections.Generic) | Microsoft Docs
cs
1{
2 // list2を順に回しlist1に最初に出現したものを削除
3 var list1 = new List<int> { 1, 2, 3, 1, 3 };
4 var list2 = new List<int> { 3, 4, 5 };
5 foreach (var i in list2)
6 {
7 list1.Remove(i);
8 }
9 Console.WriteLine(string.Join(", ", list1)); // 1, 2, 1, 3
10}
11{
12 var list1 = new List<int> { 1, 2, 3, 1, 3 };
13 var list2 = new List<int> { 3, 4, 5 };
14 foreach (var i in list1)
15 {
16 list2.Remove(i);
17 }
18 Console.WriteLine(string.Join(", ", list2)); // 4, 5
19}
20
21{
22 // list1の中でlist2から削除できなかったものだけ抽出
23 var list1 = new List<int> { 1, 2, 3, 1, 3 };
24 var list2 = new List<int> { 3, 4, 5 };
25 var list = list1.Where(x => !list2.Remove(x)).ToList();
26 Console.WriteLine(string.Join(", ", list)); // 1, 2, 1, 3
27}
28{
29 var list1 = new List<int> { 1, 2, 3, 1, 3 };
30 var list2 = new List<int> { 3, 4, 5 };
31 var list = list2.Where(x => !list1.Remove(x)).ToList();
32 Console.WriteLine(string.Join(", ", list)); // 4, 5
33}
LINQタグもあるのでLINQ版もやりましたが、副作用があるのは個人的には嫌ですね^^;