2
votes

Cela peut-il être fait uniquement avec c # linq

Disons que j'ai une liste de commandes comme celle-ci:

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

Je souhaite renvoyer une valeur booléenne indiquant s'il existe une commande qui a les deux marques B1 et B2, avec des unités de produits supérieures à 3.

Voici ce que j'ai essayé et essayé:

OrderName      ProductBrand    ProductUnit

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


3 commentaires

Bienvenue dans Stack Overflow! Veuillez consulter rédiger la question parfaite pour vous aider à posez une bonne question. Ce que vous voulez savoir n'est pas très clair.


Vous avez presque raison: Orders.GroupBy (x => x.OrderName) .Any (y => y.Any (z => (z.ProductBrand == "B1" && z.ProductUnit> 3)) && y.Any (z => z.ProductBrand == "B2" && z.ProductUnit> 3)); . Un élément ne peut pas être les deux (B1 et B2) en même temps, vous devez donc vérifier deux fois.


@SaniSinghHuttunen C'est tout. Je vous remercie !


3 Réponses :


0
votes
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)));
    }
In your query you're checking for a single element containing both clauses, which is always false since an element can't have a ProductBrand B1 and B2 at the same time.You need to check for 2 distinct elements, i.e. checking it twice.

0 commentaires

0
votes

Essayez ceci:

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


3 commentaires

1. OP a demandé un booléen pas les éléments eux-mêmes. 2. Votre condition ProductUnit est incorrecte. Doit être > 3 . 3. Votre logique est défectueuse. Cela renverra un résultat positif s'il y a plus d'un du même ProductBrand avec ProductUnit de 3 ou plus dans le même ordre. C'est-à-dire que vous pourriez avoir 2 B1 et pas de B2 et il renverrait toujours une correspondance.


@SaniSinghHuttunen Vous vous trompez, j'ai utilisé Distonct sur OrderName pour éviter ce que vous signifiez. Pour d'autres remarques, voir mise à jour


D'après ce que j'ai vu en premier, Distinct n'était pas là. Je me trompe peut-être cependant. Après vos corrections, cette réponse est désormais valide.



0
votes

Votre solution était presque là, sauf qu'au lieu de vérifier que chaque commande du groupe avait à la fois une marque B1 et B2, vous deviez obtenir toutes les marques B1 et B2 et vérifier que vous aviez deux marques uniques.

Ceci est essentiellement la même que la solution ci-dessus, sauf avec une expression légèrement différente.

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


0 commentaires