あるリストの中に別のリストの要素が存在するかを確認したい場合、以下のようなコードを書くことができます。
var flag = list.Any(x => list2.Any(y => y == x));
しかし、Any関数の中にAny関数が入っており、可読性がかなり悪いです。ぱっと見は何をやっているのか全く分かりません。あと別の記事で書いていますが、かなり遅いです。
[C#]Any関数の速度 – TOMATONOTE (tomato-note.com)
今回は備忘録的に修正案を三つ提示します。
Any
の中で Contains
を使用する
Any
の中で Contains
メソッドを使うことで、より簡潔なコードにできます。O(n)
で探索してくれます。
var flag = list.Any(x => list2.Contains(x));
Intersect
を使用する
Intersect
メソッドを使うことで、両リストの共通要素が存在するかどうかをチェックできます。Any
を使って共通要素が1つでもあるか確認します。
var flag = list.Intersect(list2).Any();
HashSet
を使用して効率化
ToHashSetの計算量が無視できるくらいlist2
が大きい場合、HashSet
を使うことで、Contains
操作を高速化できます。
var set = list2.ToHashSet(); var flag = list.Any(x => set.Contains(x));
コメントを残す