IEnumerable.Intersect() を使用して複数のリストの共通部分を見つけます
C# の IEnumerable.Intersect() メソッドを使用すると、2 つのシーケンス内の共通要素を見つけることができます。しかし、複数のリストがあり、すべてのリストに存在する要素を識別したい場合はどうすればよいでしょうか?
質問:
整数のリストのリストが与えられた場合:
<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>
IEnumerable.Intersect() を使用してこれらのリストの共通部分を見つけ、結果 List
解決策 1: HashSet の集約
<code class="language-csharp">var intersection = listOfLists .Skip(1) .Aggregate( new HashSet<int>(listOfLists.First()), (h, e) => { h.IntersectWith(e); return h; } );</code>
このソリューションは、Aggregate() メソッドを使用して、リストの共通部分を表す HashSet を蓄積します。 Skip(1) メソッドは、listOfLists の最初のリストが HashSet の初期値として使用されるようにします。
解決策 2: HashSet の反復
<code class="language-csharp">var intersection = new HashSet<int>(listOfLists.First()); foreach (var list in listOfLists.Skip(1)) { var intersect = new HashSet<int>(intersection); intersection.IntersectWith(list); }</code>
このソリューションでも HashSet を使用しますが、残りのリストを反復処理して、交差ごとに新しい HashSet を作成します。
パフォーマンスに関する考慮事項:
パフォーマンス ベンチマークでは、ほとんどの場合、HashSet ソリューションがリストを使用した場合のパフォーマンスを上回ることが示されています。 foreach メソッドと Aggregate メソッドのパフォーマンスの違いは無視できます。
以上がIEnumerable.Intersect() を使用して複数のリストの共通部分を見つける方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。