C# Linq - Рефакторинг ForEach L oop с подсписком - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь провести рефакторинг некоторых данных для отображения некоторых диаграмм.

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

var categories = VehicleSales.Select(v => v.name).Distinct().ToList();
        var refactoredResults = new List<StackedColumnChart>();

        foreach (var category in categories)
        {
            var subresult = VehicleSales.Where(x => x.vehicleType == category)
                .GroupBy(x => x.vehicleType)
                .Select(gcs => new StackedColumnChart
                {
                    Category = category,
                    Values = gcs.Select(x => (int)x.data).DefaultIfEmpty(0).ToList()
                }).ToList();
            refactoredResults.AddRange(subresult);
        }

Исходные данные:

enter image description here

Тогда фактические результаты и ожидаемые Результаты:

enter image description here

Заранее спасибо!

1 Ответ

1 голос
/ 09 апреля 2020

Вы можете сделать это без l oop и выбора различных значений, просто используйте метод GroupBy и сопоставьте каждую группу с StackedColumnChart, используя Select

var refactoredResults = VehicleSales
    .GroupBy(s => s.Category)
    .Select(g => new StackedColumnChart
    {
        Category = g.Key,
        Values = g.Select(s => s.Value).ToList()
    })
    .ToList();

Если исходные данные не отсортированы и вам нужно отсортировать значения по номеру недели, вы можете использовать предложение OrderBy перед выбором значений Values = g.OrderBy(s => s.WeekNumber).Select(s => s.Value).ToList()

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