【问题标题】:converting int to List<double?>, ChartJS Core将 int 转换为 List<double?>,ChartJS Core
【发布时间】:2020-09-07 16:55:30
【问题描述】:

我正在开发一个网络应用程序。我发现这很有趣https://github.com/mattosaurus/ChartJSCore。在我的应用程序中使用图表。

图表在大多数页面中都能成功运行。但在一页中我有以下想法:

我的模型中有 3 个属性(Appropriate、Inappropriate、NoInteraction),它们的类型都为 (int),我需要将其保留为整数以操作应用程序中的其他功能。每个属性将在图表中表示为一个系列,它应该始终是 15 个整数的列表或数组。

这是我在会话模型中的属性:

    public int DayNumber { get; set; } 
    public int Appropriate { get; set; }
    public int NotAppropriate { get; set; } 
    public int NoInteraction { get; set; }

这是我的控制器:

     public IActionResult Details()
        {

            var result = _db.Session.ToList();

//I want this appropriateLine to be passed to GenerateLineChart method but whenever i tried i came up with an error of converting types.
            var AppropriateLine = result.Select(x => x.Appropriate).ToList(); 

            Chart lineChart = GenerateLineChart();
            ViewData["LineChart"] = lineChart;

            return View();
        }

    private static Chart GenerateLineChart()
    {
      
        Chart chart = new Chart();
        chart.Type = Enums.ChartType.Line;

        ChartJSCore.Models.Data data = new ChartJSCore.Models.Data();
        

        data.Labels = new List<string>() { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15" };

        LineDataset AppropriateDataset = new LineDataset()
        {
            Label = "Appropriate Data Line",
            Data = new List<double?>() { 2, 6, 2, 6, 2, 6 }, //Here i want this to be filled with data from AppropriateLine variable, it works for the fixed value only
            Fill = "false",
            LineTension = 0.1,
            BackgroundColor = ChartColor.FromHexString("#FF6384"),
            BorderColor = ChartColor.FromHexString("#FF6384"),
            BorderCapStyle = "butt",
            BorderDash = new List<int> { },
            BorderDashOffset = 0.0,
            BorderJoinStyle = "miter",
            PointBorderColor = new List<ChartColor>() { ChartColor.FromHexString("#FF6384"), },
            PointBackgroundColor = new List<ChartColor>() { ChartColor.FromHexString("#fff") },
            PointBorderWidth = new List<int> { 1 },
            PointHoverRadius = new List<int> { 5 },
            PointHoverBackgroundColor = new List<ChartColor>() { ChartColor.FromHexString("#FF6384"), },
            PointHoverBorderColor = new List<ChartColor>() { ChartColor.FromHexString("#FF6384"), },
            PointHoverBorderWidth = new List<int> { 2 },
            PointRadius = new List<int> { 1 },
            PointHitRadius = new List<int> { 10 },
            SpanGaps = false
        };

      
        data.Datasets = new List<Dataset>();
        data.Datasets.Add(AppropriateDataset);
      

        Options options = new Options()
        {
            Scales = new Scales()
        };

        Scales scales = new Scales()
        {
            YAxes = new List<Scale>()
            {
                new CartesianScale()
            }
        };

        CartesianScale yAxes = new CartesianScale()
        {
            Ticks = new Tick()
        };

        Tick tick = new Tick()
        {
            Callback = "function(value, index, values) {return '' + value;}"
        };

        yAxes.Ticks = tick;
        scales.YAxes = new List<Scale>() { yAxes };
        options.Scales = scales;
        chart.Options = options;

        chart.Data = data;

        return chart;
    }

在将它传递给 GenerateLineChart() 之前,我如何实现适当Line 变量的“显式转换”,它是 (int)。

请注意,我不想更改模型属性类型,因为许多函数都依赖于它。另外,我无法从 List 更改数据类型,因为添加这个解决了许多其他问题。

我尝试了许多铸造解决方案,但没有一个适合我,例如:

  1. (List)result.Select(x => x.Appropriate);

  2. 私有静态图表 GenerateLineChart((List)AppropriateLine)

  3. 我读过“全部转换”方法,但没有用。

非常感谢任何帮助,

提前致谢。

【问题讨论】:

  • 所以您仍然希望返回 List 但所有值都被舍入(或截断)为整数? result.Select(x =&gt; (double)(int)x.Appropriate).ToList()

标签: c# .net asp.net-mvc asp.net-core chart.js


【解决方案1】:

根据您提到的情况,传递给GenerateLineChart 的数据似乎仅用于 UI 目的。也就是说,这种方法可以得到原始数据的一个合适的copy。如果是这种情况,那么,您尝试使用的解决方案

(List<double?>)result.Select(x => x.Appropriate)

非常接近,但演员需要在Select内完成,即

result.Select(x => (double?)x.Appropriate)

这是你的代码的草图

public IActionResult Details()
{
    var result = _db.Session.ToList();
    var AppropriateLine = result.Select(x => (double?)x.Appropriate).ToList(); 
    var lineChart = GenerateLineChart(AppropriateLine);
    // Rest or your code
}

private static Chart GenerateLineChart(IEnumerable<double?> data)
{
    // Your code as is here ....

    LineDataset AppropriateDataset = new LineDataset()
    {
        Data = data,
        // Rest of your code
    }
    // ....
}

【讨论】:

    【解决方案2】:

    如果数字是 double 或 int bool isInt = d == (int)d;,也许您现在可以检查您是否需要该列表,并解析为仅在辅助上使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      相关资源
      最近更新 更多