05. september 2013 - 22:32Der er
3 kommentarer og 1 løsning
Linq Group By - HELP
Jeg kunne virkelig godt bruge løsningen på dette kodeproblem :) Jeg har "List<OrderItem>" med masser data, og vil gerne lave en Group by på "TypeID" og "MenuID" og så tæller sammen i "Quantity" og udregner "LineTotal = Quantity * Price"
Er her en som er lidt awesome til Linq C# ? :)
public class OrderItem { public int ID { get; set; } public int TypeID { get; set; } public int MenuID { get; set; } public string Name { get; set; } public int Price { get; set; } public int Quantity { get; set; } public int LineTotal { get; set; } }
Siden du ikke laver GroupBy på price, kan du ikke gøre helt som du skriver, men du kan vist nok gøre sådan her. Burde give det samme hvis prisen er samme for TypeId og MenuID.
List<OrderItem> list = new List<OrderItem>(); var t = list.GroupBy(x => new { x.TypeID, x.MenuID }).Select(t => new {Obj = t, Sum = t.Sum(x => x.Sum(y => y.Quantity * y.Price)}); foreach (var item in t) { var groupByKey = item.Obj.Key; var sum = item.Sum; }
using System; using System.Collections.Generic; using System.Linq;
namespace E { public class OrderItem { public int ID { get; set; } public int TypeID { get; set; } public int MenuID { get; set; } public string Name { get; set; } public int Price { get; set; } public int Quantity { get; set; } public int LineTotal { get { return Price*Quantity; } } // This is not a real property !!!! } public class Program { public static void Main(string[] args) { List<OrderItem> lst = new List<OrderItem> { new OrderItem { ID = 1, TypeID = 1, MenuID = 1, Name = "A", Price = 100, Quantity = 2 }, new OrderItem { ID = 2, TypeID = 1, MenuID = 1, Name = "A", Price = 100, Quantity = 1 }, new OrderItem { ID = 3, TypeID = 1, MenuID = 2, Name = "C", Price = 50, Quantity = 1 }, new OrderItem { ID = 4, TypeID = 2, MenuID = 1, Name = "D", Price = 75, Quantity = 1 } }; foreach(var o in lst.GroupBy(oi => Tuple.Create(oi.TypeID, oi.MenuID)).Select(g => Tuple.Create(g.Key, g.Sum(oi => oi.Quantity), g.Sum(oi => oi.LineTotal)))) { Console.WriteLine("{0} {1} {2} {3}", o.Item1.Item1, o.Item1.Item2, o.Item2, o.Item3); } Console.ReadKey(); } } }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.