【问题标题】:C# Linq - Refactoring ForEach Loop with Sub ListC# Linq - 使用子列表重构 ForEach 循环
【发布时间】:2020-04-09 18:51:26
【问题描述】:

我正在尝试重构一些数据以显示一些图表。

我似乎无法弄清楚为什么要使用以下内容,它会在顶部列出所有值,而不是像源数据那样按顺序排列。

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);
        }

源数据:

那么实际结果和预期结果:

提前致谢!

【问题讨论】:

  • 您的源数据实际上是按 WeekNumber 排序的,还是仅以这种方式排序以在 Excel 中显示在您的屏幕截图中?您是否需要在 linq 查询中添加排序步骤以确保此类排序?

标签: c# linq foreach


【解决方案1】:

您可以在没有循环的情况下执行此操作并选择不同的值,只需使用 GroupBy 方法并使用 Select 将每个组映射到 StackedColumnChart

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 =&gt; s.WeekNumber).Select(s =&gt; s.Value).ToList()

【讨论】:

  • @Harry 是否回答了您的问题,您需要更多详细信息或信息吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
相关资源
最近更新 更多