只能使用C#Linq来完成

时间:2019-06-08 11:07:36

标签: 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)));
} 

3 个答案:

答案 0 :(得分:1)

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)) 
                       && y.Any( l => (l.ProductBrand == "B2" && l.ProductUnit > 3)));
    }

在查询中,您正在检查包含两个子句的单个元素,该元素始终为false,因为一个元素不能同时具有ProductBrand B1B2

您需要检查2个不同的元素,即检查两次。

答案 1 :(得分:0)

尝试一下:

  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)
    };

  orders
    .Where(o => o.ProductUnit > 3 && (o.ProductBrand == "B1" || o.ProductBrand == "B2"))
    .GroupBy(o => o.OrderName)
    .Where(g => g.Select(o => o.OrderName).Distinct().Count() >= 2)
    .Select(g => g.Key)
    .Any();

答案 2 :(得分:0)

您的解决方案几乎就存在了,除了您需要检查组中的每个订单是否都有B1和B2品牌,而是需要获得所有B1和B2品牌并检查您是否拥有两个独特的品牌。

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

807244