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を使用してそれを行うにはどうすればよいですか?
list1.All(x => list2.Any(y => x.SupplierId == y.SupplierId));
list1のすべてのアイテムがlist2にあるかどうかを教えてくれます。
list1
にないIDがlist2
にあるかどうかを確認したい:
if (list1.Select(p => p.SupplierId).Except(list2.Select(p => p.SupplierId)).Any())
list1
にすべてのlist2
が含まれていることを確認するには、list1
のAny
がlist2
のAll
と一致するかどうかを確認します。
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);