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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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