c#LiveCharts WPF如何在CartesianChart中不显示数据的日期上添加0值

时间:2019-11-24 11:12:02

标签: c# livecharts

这个问题可能更像是一个概念性问题,但我在逻辑上被困在这里。 我将LiveChart用于WPF,并尝试动态构建简单的CartesianChart。

我将数据从CSV加载到列表中,我正在计算每个数据对在该文件中的次数,然后添加数量。此Linq请求的结果如下:

[0] { Dates = "20191123", Rank = "1st", Amount = 1 }    <Anonymous Type>

我会通过此结果为我的笛卡尔图标签单独选择每个日期

现在,我想将结果数据添加到CartesianChart中,因为我需要一个SeriesCollection矿山,如下所示:

 SeriesCollection = new SeriesCollection
        {
            new LineSeries
            {
                Title = "1st",
                 Values = new ChartValues<int> {}
            },
            new LineSeries
            {
                Title = "2nd",
                 Values = new ChartValues<int> {}
            },
            new LineSeries
            {
                Title = "3rd",
                 Values = new ChartValues<int> {}
            }
}

但是,当我在某些日期浏览数据时,例如我没有第一名,因此这一天我需要将金额设置为0。我正在努力将此添加到我的数据中。

这里几乎正在试验整个代码块,这也是为什么它看起来有些混乱的原因。

        var data = File.ReadAllLines(FilePathes.resultPath).ToList();
        var rankHistoryList = new List<RankHistory>();
        foreach (var line in data)
        {
            rankHistoryList.Add(RankHistory.parse(line));
        };


        var result = rankHistoryList.GroupBy(x => new { x.Dates, x.Rank })
               .Select(g => new { g.Key.Dates, g.Key.Rank, Amount = g.Count() })

               .ToList();

        var dates = new List<string>();

        foreach (var entry in result)
        {
            dates.Add(entry.Dates);                     
        }
        var singleDates = dates.GroupBy(x => x).Select(grp => grp.First()).ToArray();

        foreach (var day in singleDates) { 
            foreach (var entry in result) { 
                if (entry.Rank == "1st" && day == entry.Dates)
                {
                    SeriesCollection[0].Values.Add(entry.Amount);                                                
                }
                else if (entry.Rank != "1st" && day == entry.Dates)  
                { SeriesCollection[0].Values.Add(0); }
            }
        }

1 个答案:

答案 0 :(得分:0)

我认为我的答案是最复杂的,但至少可以奏效:

 var allRanks = new List<string>
        {
            "1st"
            ,"2nd"
            ,"3rd"

        };

        foreach (var entry in result)
        {
            dates.Add(entry.Dates);
        }
        var singleDates = dates.GroupBy(x => x).Select(grp => grp.First()).ToArray();
        Labels = singleDates;

        foreach (var ran in allRanks)
        {
            foreach (var day in singleDates)
            {
                if (ran == "1st")
                {
                    if (result.Exists(x => x.Dates == day && x.Rank == ran) == true)
                    {                 
                    SeriesCollection[0].Values.Add(result.Where(w => w.Dates == day && w.Rank == ran).Select(x => x.Amount).First());
                    }
                    else SeriesCollection[0].Values.Add(0);
                }

                if (ran == "2nd")
                {
                    if (result.Exists(x => x.Dates == day && x.Rank == ran) == true)
                    {
                        SeriesCollection[1].Values.Add(result.Where(w => w.Dates == day && w.Rank == ran).Select(x => x.Amount).First());
                    }
                    else SeriesCollection[1].Values.Add(0);
                }
                if (ran == "3rd")
                {
                    if (result.Exists(x => x.Dates == day && x.Rank == ran) == true)
                    {
                        SeriesCollection[2].Values.Add(result.Where(w => w.Dates == day && w.Rank == ran).Select(x => x.Amount).First());
                    }
                    else SeriesCollection[2].Values.Add(0);
                }

            }
        }