Подсчитать все данные, которые сгруппированы в списке - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь подсчитать общее количество данных, сгруппированных в моем списке.

Так вот мой код:

List<InventoryViewModel> temp =
    InventoriesByLocation.GroupBy(s => s.ProductId).Select(group => group.First()).ToList();

Я хочу посчитать, сколько productId это уже groupby ().

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Итак, у вас есть последовательность InventoryViewModels, где каждый InventoryViewModel имеет ProductId.

Вы хотите сгруппировать все InventoryViewModels в группы, где каждая группа содержит все InventoryViewModels с одинаковыми ProductId. После этого вы хотите посчитать количество InventoryViewModels в каждой группе и, возможно, также некоторые другие предметы. Ваш пример кода занимает первый элемент в группе.

var groupsWithSameProductId = inventoryViewModels
    .GroupBy(inventoryViewModel => inventoryViewModel.ProductId)

Теперь у каждой группы есть Key, который содержит ProductId, который одинаков для всех элементов в вашей группе. Сама группа представляет собой последовательность всех InventoryViewModels, которые имеют ProductId, равный Key.

Чтобы получить число InventoryViewModels, у которого есть этот ProductId, просто Count() их. Если вы хотите другие предметы, просто Select их:

// continue the LINQ statement
.Select(group => new
{
    ProductId = group.Key,
    NrOfInventroyViewModelsWithThisProductId = group.Count(),

    // only if you want other items:
    FirstInventoryViewModel = group.First(),
    Names = group.Select(groupItem => groupItem.Name).ToList(),
});

Обратите внимание, что каждый groupItem является InventoryViewModel с ProductId, равным group.Key

Существует перегрузка для Enumerable.GroupBy , которая объединяет группировку и выбор в одном операторе:

var result = inventoryViewModels
    .GroupBy(inventoryViewModel => inventoryViewModel.ProductId,   // make groups with same productId
       (commonProductId, inventoryViewModelsWithThisCommonProductId) => new
       {
            ProductId = commonProductId,
            Count = inventoryViewModelsWithThisCommonProductId.Count(),
            Names = inventoryViewModelsWithThisCommonProductId
                    .Select(inventoryViewModelWithThisCommonProductId.Name)
                    .ToList(),
       });
0 голосов
/ 11 ноября 2018

Примерно так:

var count = InventoriesByLocation.GroupBy(s => s.ProductId).Count();

По сути, GroupBy возвращает тип, примерно эквивалентный IDictionary<int, InventoryViewModel[]> в вашем случае. Таким образом, длина отдельной словарной записи будет равна количеству уникальных ProductId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...