複数の C# リストにわたる共通要素の決定
リストのコレクションがあり、それらすべてに存在する要素を識別する必要があると想像してください。 例:
<code class="language-csharp">var list1 = new List<int>() { 1, 2, 3 }; var list2 = new List<int>() { 2, 3, 4 }; var list3 = new List<int>() { 3, 4, 5 }; var listOfLists = new List<List<int>>() { list1, list2, list3 };</code>
望ましい結果は、3 つのリストすべてに共通の要素のみを含むリストです: {3}
.
リスト アキュムレータで IEnumerable.Intersect()
を活用する
効果的な方法の 1 つは、アキュムレータとして機能するリストで IEnumerable.Intersect()
を繰り返し使用することです。
<code class="language-csharp">var intersection = listOfLists.Skip(1) .Aggregate( new List<int>(listOfLists.First()), (list, subList) => list.Intersect(subList).ToList() );</code>
このコードは最初のリストから始まり、後続の各リストと繰り返し交差します。
HashSet アキュムレータで IEnumerable.Intersect()
を使用する
より効率的なアプローチでは、最適化された交差機能により HashSet
をアキュムレーターとして利用します。
<code class="language-csharp">var intersection = listOfLists.Skip(1) .Aggregate( new HashSet<int>(listOfLists.First()), (h, e) => { h.IntersectWith(e); return h; } );</code>
このバージョンでは、セットのよりパフォーマンスの高い操作である IntersectWith()
が採用されています。 これが正しく機能するには、listOfLists
に少なくとも 1 つのリストが含まれている必要があることに注意してください。
どちらの手法も、IEnumerable.Intersect()
を使用して複数のリストの共通部分を見つける効率的な方法を提供します。 HashSet
メソッドは、より大きなデータセットを扱う場合、パフォーマンス上の利点があるため、一般に好まれます。
以上がC# で複数のリストの共通部分を効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。