使用linq的订单列表到分组订单

本文关键字:列表 linq 单列表 使用 | 更新日期: 2023-09-27 18:03:17

我有一个类Order,像

class Order
{
   IEnumerable<Item> Items { get; set; }
}

Item类看起来像

class Item
{
   string SomeProperty { get; set; } 
   string SomeProperty1 { get; set; } 
   string SomeProperty2 { get; set; } 
}

Model是Order的列表,如

@model IEnumerable<Order>

我想将相同的项目按一个顺序分组意味着在Item.SomeProperty上分组

我可以通过以下命令实现(使用linq将集合列表转换为分组集合列表)

var orderedGroups = Model
    .SelectMany(order => order.Items)
    .GroupBy(order => order.ItemNo)
    .OrderByDescending(grp => grp.Count()).ToList();

有了这个,我想确保所有组都有相同数量的项目,这取决于最大计数和添加"空白"结果到计数较低的组,但我不知道如何进一步进行

使用linq的订单列表到分组订单

需求很奇怪,不确定用例,但这是我将如何实现它:

var orderedGroups = Model
    .SelectMany(order => order.Items)
    .GroupBy(order => order.ItemNo)
    .OrderByDescending(order => order.Count())
    .ToDictionary(order => order.Key, order => order.ToList());

orderedGroups将是类型Dictionary<string,List<Item>>,假设ItemNo是字符串

获取Descending sorted collection的最大元素个数:

var maxElements = orderedGroups.First().Value.Count; // Max elements collection is at the top
foreach (var x in orderedGroups.Skip(1)) // Skip the processing of first collection, as that has maximum number of elements
        {       
            int yMax = maxElements - x.Value.Count ; // Count of each Item collection
            for (int y = 0; y < yMax; y++)
            {
                x.Value.Add(default(Item)); // Adding `default Item`, replace with any standard value
            }
        }

使用Integer代替Item的另一个工作版本的代码:

List<int> testList = new List<int> {1,2,3,4,1,3,5,6,3,6,4,2,1,3,7,7,7,7,7,7,7};
        var orderedGroups = testList.GroupBy(x => x)
                                    .OrderByDescending(x => x.Count())
                                    .ToDictionary(x => x.Key, x => x.ToList());

        var maxElements = orderedGroups.First().Value.Count;

        foreach (var x in orderedGroups.Skip(1))
        {       
            int yMax = maxElements - x.Value.Count;
            for (int y = 0; y < yMax; y++)
            {
                x.Value.Add(0); // Adding default as 0
            }
        }

    orderedGroups.Dump(); // Linqpad print call, replace with console or similar call in the visual studio