LINQ (統合言語クエリ) は、簡潔かつ効率的な方法でデータをクエリするための多用途のツールセットを提供します。一般的なシナリオには、あるリストには存在するが別のリストには存在しない項目を識別することが含まれます。
次のコード スニペットを考えてみましょう:
<code class="language-csharp">class Program { static void Main(string[] args) { List<Person> peopleList1 = new List<Person>(); peopleList1.Add(new Person() { ID = 1 }); peopleList1.Add(new Person() { ID = 2 }); peopleList1.Add(new Person() { ID = 3 }); List<Person> peopleList2 = new List<Person>(); peopleList2.Add(new Person() { ID = 1 }); peopleList2.Add(new Person() { ID = 2 }); peopleList2.Add(new Person() { ID = 3 }); peopleList2.Add(new Person() { ID = 4 }); peopleList2.Add(new Person() { ID = 5 }); } } class Person { public int ID { get; set; } }</code>
問題ステートメント: peopleList1 と peopleList2 という 2 つのリストがある場合、peopleList2 には存在するが peopleList1 には存在しない一意の人物を特定する LINQ クエリを作成します。この例では、望ましい結果は ID 4 と ID 5 を持つ人々です。
LINQ ソリューション: 次の LINQ クエリは、この問題を効果的に解決します:
<code class="language-csharp">var result = peopleList2.Where(p => !peopleList1.Any(p2 => p2.ID == p.ID));</code>
このクエリは Where() メソッドを使用し、指定された条件に基づいて peopleList2 内の項目をフィルターします。この場合、条件は peopleList1 内の項目が peopleList2 内の現在の項目と一致する ID を持つかどうかをチェックします。見つからない場合 (!peopleList1.Any() == true)、項目は結果セットに含まれます。
別の表現: あるいは、クエリは次のように表現することもできます:
<code class="language-csharp">var result = peopleList2.Where(p => peopleList1.All(p2 => p2.ID != p.ID));</code>
このバリアントは、All() メソッドを使用して、peopleList1 のすべての項目の ID が peopleList2 の現在の項目と異なるかどうかを評価します。この条件が true (peopleList1.All() == true) の場合、項目は結果セットに含まれます。
注: どちらのメソッドの計算量も O(n*m) であることに注意することが重要です。ここで、n は peopleList1 の項目数を表し、m は peopleList2 の項目数を表します。これは、大規模なデータ セットの場合、この操作が遅くなる可能性があることを意味します。パフォーマンスが問題になる場合は、ハッシュ テーブルやセット操作などの他の方法を検討してください。
以上がLINQ は、あるリスト内で他のリストには存在しない一意の項目を効率的に識別するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。