LINQ を使用して、あるリスト<> 内の項目のうち、別のリスト<> に含まれていない項目を取得します。質問する

LINQ を使用して、あるリスト<> 内の項目のうち、別のリスト<> に含まれていない項目を取得します。質問する

これを行うには簡単な LINQ クエリがあると思いますが、その方法が正確にはわかりません。

次のコードがあるとします:

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

peopleList2LINQ クエリを実行して、に含まれていて に含まれていないすべての人物を取得したいと思いますpeopleList1

この例では、2 人の人物 (ID = 4 と ID = 5) が返されます。

ベストアンサー1

これは、次の LINQ 式を使用して解決できます。

var result = peopleList2.Where(p => !peopleList1.Any(p2 => p2.ID == p.ID));

これを LINQ 経由で表現する別の方法は、一部の開発者にとってより読みやすいと感じられるものです。

var result = peopleList2.Where(p => peopleList1.All(p2 => p2.ID != p.ID));

警告:コメントに記載されているように、これらのアプローチではO(n*m)の演算が必須です。これは問題ないかもしれませんが、特にデータ セットが非常に大きい場合は、パフォーマンスの問題が発生する可能性があります。これでパフォーマンス要件が満たされない場合は、他のオプションを評価する必要があります。ただし、記載されている要件は LINQ でのソリューションに対するものであるため、これらのオプションについてはここでは説明しません。常に、プロジェクトのパフォーマンス要件に対してアプローチを評価してください。

おすすめ記事