我需要使用LINQ和XML从一组订单中找到最大的总和

时间:2010-11-02 05:22:48

标签: xml linq join

我已经从XML文件中加入了两个集合,其中包含有关餐厅订单及其订单号的信息,这些订单中的项目以及每个项目的成本。我需要找到哪个订单是最昂贵的,哪个是使用LINQ操作最便宜的。我已经达到了我加入收藏品的程度,但我不确定如何单独总结每个订单然后找出最多/最少的成本。

这是我到目前为止这部分的内容:

private void Question3_Click(object sender, RoutedEventArgs e)
    {
        var menuItems = doc
            .Root
            .Element("menuItems")
            .Elements("menuItem")
            .Select(s => new
            {
                itemNr = s.Attribute("nr"),
                itemPrice = double.Parse(s.Attribute("price").Value, NumberStyles.Currency),
                name = s.Value
            });

        var orders = doc
            .Root
            .Element("orders")
            .Elements("order")
            .Select(r => new
            {
                itemNr = r.Attribute("nr")
            });

        var joinedList = menuItems
            .Join(orders,
            menuItem => menuItem.itemNr,
            order => order.itemNr,
            (menuItem, order) => new
            {
                orderNr = order.itemNr,
                itemNr = menuItem.itemNr,
                itemPrice = menuItem.itemPrice
            });

            //.Sum(order => order.itemPrice);

        AnswerBox.Text = joinedList.ToString();
    }

编辑:这就是我现在所拥有的,而且我得到的是“序列中没有元素”

private void Question3_Click(object sender, RoutedEventArgs e)
    {
        var menuItems = doc
            .Root
            .Element("menuItems")
            .Elements("menuItem")
            .Select(s => new
            {
                itemNr = s.Attribute("nr"),
                itemPrice = double.Parse(s.Attribute("price").Value, NumberStyles.Currency),
                name = s.Value
            });

        var orders = doc
            .Root
            .Element("orders")
            .Elements("order")
            .Select(r => new
            {
                orderNr = r.Attribute("nr")
            });

        var joinedList = menuItems
            .Join(orders,
            menuItem => menuItem.itemNr,
            order => order.orderNr,
            (menuItem, order) => new
            {
                orderNr = order.orderNr,
                itemNr = menuItem.itemNr,
                itemPrice = menuItem.itemPrice
            }).GroupBy(order => order.itemNr)
            .Select(g => new
                {
                    orderNr = g.Key,
                    Sum = g.Sum(list => list.itemPrice)
                })
                    .Max(g => g.Sum);

        //var least = joinedList.Min(list => list.itemPrice);

        AnswerBox.Text = joinedList.ToString();
    }

XML:        B.L.T.     培根芝士汉堡     巴卡拉     主厨沙拉     鸡肉片     鸡炸牛排     鸡烤肉     辣椒汉堡     辣椒狗     冷火鸡     玉米狗     晚餐沙拉     双培根芝士汉堡     双汉堡     双层芝士汉堡     双皇家汉堡     鱼片     希腊式沙拉     烤奶酪     烤火腿和奶酪     陀螺     陀螺晚餐(沙拉和薯条)     热狗     初级培根芝士     少年汉堡     少年芝士汉堡     Junior Royal(Pastrami)     松饼     蘑菇瑞士汉堡     洋葱圈     Pastrami Melt     帕蒂熔体     季汉堡     四分之一汉堡配奶酪     皇家汉堡(熏牛肉)     窒息辣椒芝士汉堡     牛排炸薯条     金枪鱼三明治     金枪鱼沙拉     金枪鱼三明治                                                                                                                                                                                                                                                                                                                                                                                                                 

1 个答案:

答案 0 :(得分:0)

这段代码有帮助吗?

var grouping = from list in joinedList
           group list by list.orderNr into g
           select new { OrderNr = g.Key, Sum = g.Sum(list => list.itemPrice) };
var most = grouping.Max(g => g.Sum);
var least = grouping.Min(g => g.Sum);



编辑(解释) 您首先按OrderNr对列表进行分组。因此,您将获得orderNumbers(g.key)列表和订单的Totol价格。

OrderNr | Sum
--------------
123     | 20
345     | 48
222     | 50 

大多数将返回OrderNr = 222,Sum = 50

至少会返回OrderNr = 123,Sum = 20