首页 > 解决方案 > 这只能用 c# linq 来完成吗

问题描述

假设我有一个这样的订单列表:

OrderName      ProductBrand    ProductUnit

   A                B1              5
   B                B2              4
   B                B3              2
   A                B2              4

我有兴趣返回一个布尔值,说明是否有一个同时具有 B1 和 B2 品牌且产品单位大于 3 的订单。

这是我已经尝试过的:

public class Order
{
   public string OrderName { get; set; }
   public string ProductBrand { get; set; }
   public int ProductUnit { get; set; }

   public Order(string orderName, string productName, int productUnit)
   {
      OrderName = orderName;
      ProductBrand = productName;
      ProductUnit = productUnit;
   }
}

static void Main(string[] args)
{
   var Orders = new List<Order>
   {
     new Order("A" , "B1" , 5),
     new Order("B" , "B2" , 4),
     new Order("B" , "B3" , 2),
     new Order("A" , "B2" , 4)
    };

   var test = Orders.GroupBy(x => x.OrderName)                             
     .Any(y => y.Any( z => (z.ProductBrand == "B1" && z.ProductUnit > 3) 
         && (z.ProductBrand == "B2" && z.ProductUnit > 3)));
} 

标签: c#linq

解决方案


您的解决方案几乎就在那里,除了检查组中的每个订单是否同时具有 B1 和 B2 品牌,您需要获取所有 B1 和 B2 品牌并检查您是否有两个独特的品牌。

这与上面的解决方案基本相同,只是表达方式略有不同。

var test = Orders
    .GroupBy(order => order.OrderName)
    .Any(group => group
        .Where(order => (order.ProductBrand == "B1" && order.ProductUnit > 3) || (order.ProductBrand == "B2" && order.ProductUnit > 3))
        .Select(order => order.ProductBrand)
        .Distinct()
        .Count() == 2);

推荐阅读