我的购物车中有一些产品。一位顾客过去已经订购了他购物车中的一件商品。
我正在尝试获取他过去下过的订单列表(由
GetOrders
完成)。
将他购物车中的商品传递给我的方法(pass in *items *in my method)
检查购物车中是否有任何商品与 orderItems
匹配
public bool ProductFound(IReadOnlyCollection<OrderItems> items)
{
var orders = GetOrders();
foreach (var order in orders)
{
if (items.Intersect(order.OrderItems).Any())
{
return true;
}
}
return false;
}
我生成了上面的代码,但即使我知道 orderItems 和 items 中有相同的产品,它也永远不会返回 true。然后我尝试
order.OrderItems.ProductId
来匹配 Id,但后来出现了转换错误。
我如何检查一个列表是否包含传入的第二个列表中的任何项目?
编辑1
public bool ProductFound(IReadOnlyCollection<OrderItems> items)
{
var orders = GetOrders();
foreach (var order in orders)
{
foreach (var i in orders.OrderItems)
{
if (items.Contains(i))
{
return true;
}
}
}
return false;
}
如果自定义类未覆盖
Equals
+GetHashCode
或者您未将自定义 IEqualityComparer<T>
传递给 Intersect
,则仅比较引用,因为只有您知道要按 ProductId
进行比较。因此,要么使用不同的方法:
bool orderedBefore = orders
.Any(o => items.Select(i => i.ProductId).Intersect(o.OrderItems.Select(oi => oi.ProductId).Any()));
或者使用
Equals
覆盖 GetHashCode
+ ProductId
,您还应该实现 IEquatable<T>
。那么你就不需要投影 ProductId
。