public void Verifiziere() { var produkte = Verkaufsprodukte.ToDictionary(vk => vk.Produkt); if (produkte.Count != Verkaufsprodukte.Count) { throw new InvalidOperationException("In dieser Abrechung kommen doppelte Produkte vor."); } if (!Einkäufe.SelectMany(e => e.Positionen).Select(p => p.Kastengröße.Produkt).Distinct().All(p => produkte.ContainsKey(p))) { throw new InvalidOperationException("In den Einkäufen dieser Abrechnung kommt ein Produkt vor, das nicht Teil der Abrechnung ist."); } var paare = Verbrauche.Select(v => new { v.Benutzer, v.Verkaufsprodukt }).ToHashSet(); if (!Benutzer.SelectMany(b => Verkaufsprodukte.Select(p => new { Benutzer = b, Verkaufsprodukt = p })).All(p => paare.Contains(p))) { throw new InvalidOperationException("Diese Abrechnung hat keinen Verbrauch für jeden Benutzer und jedes Produkt"); } if (!Zahlungen.Select(z => z.Benutzer).ToHashSet().SetEquals(Benutzer)) { throw new InvalidOperationException("Diese Abrechnung enthält nicht eine Zahlung für jeden Benutzer"); } }
public Dictionary <Benutzer, double> BerechneKostenProBenutzer() { var getränkekosten = Benutzer.ToDictionary(b => b, b => 0.0); Verbrauche.ForEach(v => getränkekosten[v.Benutzer] += v.AnzahlFlaschen * v.Verkaufsprodukt.Verkaufspreis); return(getränkekosten); }
public Dictionary <Benutzer, double> BerechneVerlustumlage() { var verluste = BerechneVerluste(); var verbrauchProProdukt = BerechneVerbrauche(); var verbrauche = Verbrauche.ToDictionary(v => new { v.Benutzer, v.Verkaufsprodukt }, v => v.AnzahlFlaschen); // Jeder Benutzer beteiligt sich an den Verlusten anteilig entsprechend seinem Anteil am gesamten Verbrauch dieses Produkts return(Benutzer.ToDictionary(b => b, b => Verkaufsprodukte.Select(p => verbrauchProProdukt[p.Produkt] != 0 ? verluste[p.Produkt] * p.Verkaufspreis * verbrauche[new { Benutzer = b, Verkaufsprodukt = p }] / verbrauchProProdukt[p.Produkt] : 0.0).Sum())); }
public Dictionary <Produkt, int> BerechneVerbrauche() { return(Verbrauche.GroupBy(v => v.Verkaufsprodukt.Produkt).ToDictionary(g => g.Key, g => g.Select(v => v.AnzahlFlaschen).Sum())); }