如何首先通过物业订购物品,然后通过其他物业订购物品,而不管第一处物业是否有关系?

时间:2016-07-14 15:14:44

标签: c# linq collections grouping

我想要实现的是首先按OrderSummary最高Amount订购,然后依次显示给定帐户的集合中的所有其他Order(s),而不管Amount。预期结果在代码段中。

 public class OrderSummary
    {
        public string FirstName { get; set; }

        public decimal Amount { get; set; }
    }

    public class Worker
    {
        public List<OrderSummary> Orders { get; set; }

        public Worker()
        {
            Orders = new List<OrderSummary>()
            {
                new OrderSummary() {FirstName = "James", Amount = 10.00m},
                new OrderSummary() {FirstName = "Thomas", Amount = 11.00m},
                new OrderSummary() {FirstName = "Leon", Amount = 13.00m},
                new OrderSummary() {FirstName = "Lori", Amount = 14.00m},
                new OrderSummary() {FirstName = "Thomas", Amount = 16.00m},
                new OrderSummary() {FirstName = "Thomas", Amount = 6.00m},
                new OrderSummary() {FirstName = "James", Amount = 19.00m}
            };
        }

        //sorted by highest amount first
        //then place firstname together regardless of the amount

        //Expected Outcome
        /*
           James 19 -- highest amount followed by all other orders for James regardless of the amount.
         * james 10
         * thomas 16
         * thomas 11
         * thomas 6
         * lori 14
         * leon 13
         */
    }

我的方法是获取多次出现的所有元素,然后找到除第一个元素之外的元素的索引,将其从索引中删除,并将其添加到第一个元素的索引+ 1 ..是否有更好的方法来实现这个目标?

5 个答案:

答案 0 :(得分:3)

GroupBy按照它们在源集合中出现的顺序创建组,因此您可以先按金额订购,然后按名称分组,然后“展平”这些组:

var results = Orders.OrderByDescending(o => o.Amount)
                    .GroupBy(o => o.FistName)  // the groupings will be in order of the largest amount
                    .SelectMany(g => g);       // flatten the groups

答案 1 :(得分:0)

试试这个:

var list = Orders.OrderByDescending(y => y.Amount).GroupBy(x => x.FirstName).Select(x=>x.Key).ToList();

这是对记录进行降序排序,然后按FirstName对它们进行分组,因此您将首先拥有Amount最高的那个,然后是其他的。

答案 2 :(得分:0)

var maxAmount = Orders.Max(o => o.Amount);
var maxPos = Orders.IndexOf(maxAmount);
var maxOrder = Orders[maxPos];
Orders.RemoveAt(maxPos);
Orders.Insert(0, maxOrder);

修改

我没有得到“一个接一个”意味着“按名称分组”......

答案 3 :(得分:0)

抱歉,我有一个使用.Net小提琴的例子

这是

Answer To Question

如果有帮助,请告诉我

答案 4 :(得分:0)

  

我的方法是获取多次出现的所有元素,然后找到除第一个元素之外的元素,将其从索引中删除,并将其添加到第一个元素的索引+ 1

这是LINQ完全按照你所描述的方式进行的方式:

var query = from o in Orders
            group o by o.FirstName into g
            let top = g.Aggregate((a, b) => b.Amount > a.Amount ? b : a)
            from o in Enumerable.Repeat(top, 1).Concat(g.Where(o => o != top))
            select o;

首先按FirstName对订单进行分组,然后为每个组使用Aggregate找到具有最大金额的元素,将其放在一个组中并附加其他组。最后压扁结果。