Advertisement
Guest User

Untitled

a guest
May 27th, 2017
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.38 KB | None | 0 0
  1.         static decimal GetPrice(IEnumerable<Products> products, IDictionary<Products, decimal> prices)
  2.         {
  3.             var grouping = products.ToLookup(l => l);
  4.             var ab = grouping[Products.A]
  5.                          .TupleZip(grouping[Products.B])
  6.                          .Count() * prices.GroupPrice(Products.A, Products.B) * 0.9m;
  7.             var de = grouping[Products.D]
  8.                          .TupleZip(grouping[Products.E])
  9.                          .Count() * prices.GroupPrice(Products.A, Products.B) * 0.95m;
  10.             var efg = grouping[Products.E]
  11.                           .TupleZip(grouping[Products.F])
  12.                           .TupleZip(grouping[Products.G])
  13.                           .Count() * prices.GroupPrice(Products.A, Products.B) * 0.95m;
  14.             var aAndklm = products
  15.                 .Where(p => p == Products.C || p == Products.L || p == Products.M)
  16.                 .Take(grouping[Products.A].Count())
  17.                 .Aggregate(0m, (acc, p) => acc + prices[p] * 0.95m);
  18.             decimal onCount;
  19.             switch (products.Except(List(Products.A, Products.B)).Count())
  20.             {
  21.                 case var c when c < 3:
  22.                     onCount = 1m;
  23.                     break;
  24.                 case 3:
  25.                     onCount = 0.95m;
  26.                     break;
  27.                 case 4:
  28.                     onCount = 0.90m;
  29.                     break;
  30.                 case var c when c >= 5:
  31.                     onCount = 0.95m;
  32.                     break;
  33.                 default:
  34.                     onCount = 1m;
  35.                     break;
  36.             }
  37.  
  38.             var initalSum = products.Sum(p => prices[p]);
  39.             var result = (initalSum - ab - de - efg - aAndklm) * onCount;
  40.             return result;
  41.         }
  42.  
  43.         static IEnumerable<(T, T)> TupleZip<T>(this IEnumerable<T> c1, IEnumerable<T> c2)
  44.         {
  45.             return c1.Zip(c2, (a, b) => (a, b));
  46.         }
  47.  
  48.         static IEnumerable<(T, T, T)> TupleZip<T>(this IEnumerable<(T, T)> c1, IEnumerable<T> c2)
  49.         {
  50.             return c1.Zip(c2, (a, b) => (a.Item1, a.Item2, b));
  51.         }
  52.  
  53.         static decimal GroupPrice(this IDictionary<Products, decimal> dict, params Products[] products)
  54.         {
  55.             return products.Sum(p => dict[p]);
  56.         }
  57.  
  58.         static IEnumerable<T> List<T>(params T[] items) => items;
  59.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement