Diskuze: LINQ a group by operátor
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 2 zpráv z 2.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tak jedna neefektivita je už v tom, že abys dostal kategorie, nejdřív procházíš zákazníky a jejich produkty. Což má ještě navíc problém, že ti ve výsledku budou chybět kategorie, ze kterých si nikdo nic neobjedná, a naopak když si toho někdo z jedné kategorie objedná víc, budeš ho tam mít víckrát. To druhé se dá obejít distinctem, ale přiznám se, že ani nevím, jak se v tomhle zápise distinct píše, a jestli to vůbec jde (StackOverflow: nejde). Osobně tohle wannabe SQL vůbec nepoužívám, řetězení metod mi přijde přehlednější a přirozenější.
Každopádně seznam kategorií by pro tebe měl být vstup. Bohužel C# neumí nativně proiterovat enum, takže se to musí obcházet pomocí statických metod GetNames nebo GetValues. GetValues je asi pocitově čistší, ale zas vrací jen negenerický Array. Takže nejlíp asi takto:
foreach (var category in Enum.GetValues(typeof(Product.Category)).Cast<Product.Category>())
{
Console.WriteLine("Category: " + category.ToString());
foreach (var cust in customers.Where(c => c.OrderedProduct.Select(p => p.ProductCategory).Contains(category)))
Console.WriteLine("\t" + cust.Surname);
}
Zobrazeno 2 zpráv z 2.