1. ホーム
  2. c#

[解決済み] LINQ を使用して、ある List<> にある項目を別の List<> にない項目として取得する。

2022-03-15 15:25:53

質問

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

に含まれるすべての人々を得るためにLINQクエリを実行したいと思います。 peopleList2 に含まれないもので、かつ peopleList1 .

この例では、2人の人物(ID = 4 & ID = 5)を得ることができるはずです。

どのように解決するのですか?

これは、以下の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で解決することが要求されているため、ここではそのようなオプションは検討しません。いつものように、あなたのプロジェクトが要求する性能に対して、どのようなアプローチも評価してください。