Список заказов в сгруппированные заказы, используя linq

c# linq

49 просмотра

1 ответ

У меня есть класс Order как

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

Класс предмета выглядит как

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

Модель представляет собой список порядка, как

@model IEnumerable<Order>

Я хочу, чтобы сгруппировать одни и те же элементы в одном порядке означает группировать по Item.SomeProperty

Я могу добиться этого, следуя ( Список сбора в список сбора сгруппированных с помощью linq )

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

При этом я хочу убедиться, что все группы имеют одинаковое количество элементов, в зависимости от максимального количества и добавления «пустых» результатов в группы с меньшим количеством, но я не знаю, как действовать дальше.

Автор: Nikhil Gupta Источник Размещён: 08.11.2019 11:22

Ответы (1)


2 плюса

Решение

Требования довольно странные, не уверен насчет варианта использования, но вот как я бы этого достиг:

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
Автор: Mrinal Kamboj Размещён: 20.08.2016 08:29
Вопросы из категории :
32x32