【问题标题】:Converting data from discrete properties of objects in an IEnumerable into an array/series for charting?将数据从 IEnumerable 中对象的离散属性转换为用于图表的数组/系列?
【发布时间】:2011-10-05 09:04:25
【问题描述】:

我有一个特定类型的 IEnumerable (List)。该类型有一组属性,我想将它们绘制为单独的系列(MVC3/Razor)。

有没有办法可以将对象列表中的数据转换为属性列表?

例如 鉴于下面的代码,我试图实现的最终结果是一组系列,所以我有

Bucket1: IEnumerable<Date, Value>
Bucket2: IEnumerable<Date, Value>
etc

这样我就可以绘制每个系列的图表,以获得 x 上的日期和 y 上的值的折线图,用于(在此示例中)3 个系列/线。这段代码运行良好,但感觉有点不对劲?

 var buckets = new List<Bucket>(){
            new Bucket{
                    Date=DateTime.Today.AddDays(-3),
                    Bucket1=1000,
                    Bucket2=2000,
                    Bucket3=3000},
                new Bucket{
                    Date=DateTime.Today.AddDays(-2),
                    Bucket1=1000,
                    Bucket2=2020,
                    Bucket3=3300},
                new Bucket{
                    Date=DateTime.Today.AddDays(-1),
                    Bucket1=1000,
                    Bucket2=2040,
                    Bucket3=3600}
        };

        var chart = new Chart(){ Height = 400, Width = 600 };
        var area = new ChartArea();
        chart.ChartAreas.Add(area);

        var series1 = chart.Series.Add("Bucket 1");
        var series2 = chart.Series.Add("Bucket 2");
        var series3 = chart.Series.Add("Bucket 3");
        foreach (var series in chart.Series)
        {
            series.ChartType = SeriesChartType.Line;
        }

        foreach (var item in buckets)
        {
            series1.Points.AddXY(item.Date, item.Bucket1);
            series2.Points.AddXY(item.Date, item.Bucket2);
            series3.Points.AddXY(item.Date, item.Bucket3);
        }

【问题讨论】:

  • 代码并不是真的“错误”。您可能可以使用 Linq GroupBy 缩短它,但这取决于系列接受的格式。就这样吧。
  • 同意这并不是真正的“错误”......只是看起来很笨重。
  • 发布 Bucket 类并解释你想要实现的目标。每个桶类应该属于一天吗?每个存储桶条目(bucket1,bucket2,bucket3)是否应该有自己的日期?
  • Bucket 类就是您在此处看到的 - 每个日期一个。
  • @Henk Holterman:你能补充一个答案吗?我环顾四周,四处乱逛,得出的结论是没有办法让它变得“更干净”。我添加了一些 linq 来从枚举中获取系列名称,但这就是我真正能做的。

标签: c# linq asp.net-mvc-3 charts razor


【解决方案1】:

对于每个系列只使用一个 Lambda 表达式怎么样(下面的代码未经测试 - 它只是一个原型):

var series1 = buckets.Select(b => new { b.Date, b.Bucket1 });
var series2 = buckets.Select(b => new { b.Date, b.Bucket2 });

【讨论】:

    【解决方案2】:

    感谢发布的 cmets,我保留了原始代码,并且认为没有更简单的方法可以做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2022-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      相关资源
      最近更新 更多