[C#]Any関数の中にAny関数がある場合のリファクタリング

あるリストの中に別のリストの要素が存在するかを確認したい場合、以下のようなコードを書くことができます。

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));

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です