【问题标题】:List of Orders to Grouped Orders using linq使用 linq 到分组订单的订单列表
【发布时间】:2016-08-21 13:58:09
【问题描述】:

我有一个类 Order 像

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

物品类看起来像

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

Model 是一个类似 Order 的列表

@model IEnumerable<Order>

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

我可以通过关注 (Collection list to grouped collection list using linq) 来实现这一点

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

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

【问题讨论】:

  • 你可能在最后错过了一个 Select。
  • 不确定您是否可以仅使用 linq 来做到这一点。如果你知道你想要多少,你可以使用.Where count = x,但如果不知道,那么你需要添加一些逻辑。如果您有 6 个组的计数:33 22 11 会发生什么?
  • @zivweissman 如果有 r 6 个订单,其中很少有 3 件商品,很少有 2 件商品,很少有 1 件商品,那么分组集合将在所有订单中各有 3 件商品,一些订单将有 r两个空白项。我需要设计一个比较屏幕,其中需要比较分组项目,并且还需要显示空白项目以使 html 看起来正确。

标签: c# linq


【解决方案1】:

需求很奇怪,不确定用例,但这是我实现它的方式:

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

orderedGroups 将是 Dictionary&lt;string,List&lt;Item&gt;&gt; 类型,假设 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多