代码之家  ›  专栏  ›  技术社区  ›  Jonas Elfström

如何使用LINQ在列表<Order>中获取产品的唯一条目

  •  3
  • Jonas Elfström  · 技术社区  · 16 年前

    我有一个经典的订单->订单行场景如下所示:

    public class Order 
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<OrderRow> OrderRows { get; set; }
    }
    
    public class OrderRow
    {
        public int Id { get; set; }
        public int ProductId { get; set; }
        public int Amount { get; set; }
    }
    

    和一份清单<订单>。从订单列表中,我想获得所有唯一ProductID的列表。

    var orders = new List<Order>();
    // TODO get the orders from DB
    var products = new Dictionary<int,int>();
    orders.ForEach(order => order.OrderRows.ForEach(row => products[row.ProductId]=row.ProductId));
    

    但我对字典的使用提出了疑问,为什么我没有使用LINQs GroupBy,还评论说它的工作原理不太清楚。我认为这个解决方案很好,但是评论让我想尝试在LINQ中解决这个问题,但是出于某种原因,我尝试了。

    3 回复  |  直到 16 年前
        1
  •  7
  •   Matt Hamilton    16 年前

    未经测试,但如何:

    var products = orders.SelectMany(o => o.OrderRows)
                         .Select(r => r.ProductId)
                         .Distinct();
    
        2
  •  2
  •   Amy B    16 年前

    查询理解语法 仍然可以让您到达您想去的地方:

    var productIDs =
    (
      from order in orders
      from orderrow in order.OrderRows
      select orderrow.ProductId
    ).Distinct();
    
        3
  •  1
  •   mrydengren    16 年前

    这将从订单列表中获取唯一的产品ID。

    var orders = new List<Order>();
    
    // Get orders from database.
    
    IEnumerable<int> uniqueIds = orders.SelectMany(order => order.OrderRows)
        .Select(row => row.ProductId).Distinct();