web-dev-qa-db-ja.com

C#Linqは、1つのプロパティを比較するときに、リストに別のリストアイテムがすべて含まれているかどうかを確認します

Linqを学習していて、2つのオブジェクトリストがあります。これらのリストの1つを他のリストと比較して、その中のオブジェクトのプロパティの1つすべてが他のリストのプロパティと一致するかどうかを確認したいと思います。そのためのコードを提供しますが、Linq式に変更したいと思います。

        var list1 = new List<Product>
        {
            new Product{SupplierId = 1,ProductName = "Name1"},
            new Product{SupplierId = 2,ProductName = "Name2"},
            new Product{SupplierId = 3,ProductName = "Name3"},
            new Product{SupplierId = 4,ProductName = "Name4"}
        };
        var list2 = new List<Product>
        {
            new Product {SupplierId = 1,ProductName = "Name5"},
            new Product {SupplierId = 4,ProductName = "Name6"}
        };

    private static bool CheckLists(List<Product> list1, List<Product> list2)
    {
        foreach (var product2 in list2)
        {
            bool result = false;
            foreach (var product in list1)
            {
                if (product.SupplierId == product2.SupplierId)
                {
                    result = true;
                    break;
                }
            }
            if (!result)
            {
                return false;
            }
        }
        return true;
    }

Linqを使用してそれを行うにはどうすればよいですか?

4
user8981612
list1.All(x => list2.Any(y => x.SupplierId == y.SupplierId));

list1のすべてのアイテムがlist2にあるかどうかを教えてくれます。

10
Steve

list1にないIDがlist2にあるかどうかを確認したい:

if (list1.Select(p => p.SupplierId).Except(list2.Select(p => p.SupplierId)).Any())
7
SLaks

list1にすべてのlist2が含まれていることを確認するには、list1Anylist2Allと一致するかどうかを確認します。

private static bool CheckLists(List<Product> list1, List<Product> list2) => list2.All(l2p => list1.Any(l1p => l1p.SupplierId == l2p.SupplierId));

しかし、私はおそらく一般的な拡張メソッドを書くでしょう:

public static class Ext {
    static public bool ContainsAll<T, TKey>(this List<T> containingList, List<T> containee, Func<T, TKey> key) {
        var HSContainingList = new HashSet<TKey>(containingList.Select(key));
        return containee.All(l2p => HSContainingList.Contains(key(l2p)));
    }
    static public bool ContainsAll<T>(this List<T> containingList, List<T> containee) => containingList.ContainsAll(containee, item => item);
}

次に、次のように呼び出すことができます。

var ans = list1.ContainsAll(list2, p => p.SupplierId);
0
NetMage