如何从一个列表中查找另一个列表中的项目

问题描述 投票:0回答:1

我的购物车中有一些产品。一位顾客过去已经订购了他购物车中的一件商品。

我正在尝试获取他过去下过的订单列表(由

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,但后来出现了转换错误。

我如何检查一个列表是否包含传入的第二个列表中的任何项目?

我访问了此链接以供参考https://code-maze.com/csharp-check-if-items-of-a-list-exist-in-another-list/#:~:text=We%20can% 20使用%20the%20IEnumerable,()%20vs%20Count()%20in%20.

编辑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;
}
c# .net ienumerable
1个回答
1
投票

如果自定义类未覆盖

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

© www.soinside.com 2019 - 2024. All rights reserved.