Avatar billede zentral Nybegynder
05. september 2013 - 22:32 Der 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; }
}
Avatar billede Syska Mester
05. september 2013 - 23:11 #1
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;
            }
Avatar billede arne_v Ekspert
06. september 2013 - 02:45 #2
A variation:

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();
        }
    }
}
Avatar billede zentral Nybegynder
05. oktober 2013 - 05:41 #3
buzzzz post et svar det virkede fantastisk !
Avatar billede Syska Mester
05. oktober 2013 - 16:37 #4
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Cognizant Technology Solutions Denmark ApS

Test Manager

Udviklings- og Forenklingsstyrelsen

Senior IT-projektleder til modernisering af Moms domænet

Cognizant Technology Solutions Denmark ApS

Senior Test Engineer

Unik System Design A/S

Driftskonsulent for Hostingcenter