代码之家  ›  专栏  ›  技术社区  ›  Joel

C图表-多条曲线,但颜色被覆盖

  •  1
  • Joel  · 技术社区  · 8 年前

    所以我在图表中显示了多条曲线。但是,当我生成一个随机颜色时,所有其他曲线也会得到这个颜色。

    int fileIndex=0;
    Random r = new Random();
    foreach (var i in graphContainer)
    {
        fileIndex++;
        var series = new Series
        {
            Name                = legendNames[fileIndex],
            Color               = Color.FromArgb(r.Next(0, 256), r.Next(0, 256), r.Next(0, 256)),
            IsVisibleInLegend   = true,
            IsXValueIndexed     = false,
            ChartType           = SeriesChartType.Line
        };
        foreach (var j in i)
        {
            series.Points.AddXY (j.Item2, j.Item1);
        }
        chart.Invalidate        ();
        chart.Series.Add        (series);
    }
    

    注:除一条曲线外,所有曲线都有相同的值,但你知道了。 enter image description here

    为什么我的曲线会有同样的颜色?

    整个功能:

        private void generateWaveformsFromFileBtn_Click(object sender, EventArgs e)
        {
            int fileIndex                       = -1;
            string folder                       = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\WaveForms\";
            string filter                       = "*.csv";
            string[] filePath                   = Directory.GetFiles(folder, filter);
            List<string> legendNames            = new List<string>();
            List<Tuple<double, double>> graph   = new List<Tuple<double, double>>();
            List<List<Tuple<double, double>>> graphContainer = new List<List<Tuple<double, double>>>();
            chart.Series.Clear();
            foreach(var fileName in filePath) {
                legendNames.Add(Path.GetFileName(fileName));
                using (TextFieldParser csvParser = new TextFieldParser(fileName))
                {
                    csvParser.SetDelimiters (new string[] { ";" });
                    csvParser.ReadLine      ();
                    while (!csvParser.EndOfData)
                    {
                        string[] fields     = csvParser.ReadFields();
                        double current      = Double.Parse(fields[0]);
                        double inductance   = Double.Parse(fields[1]);
                        graph.Add           (new Tuple<double,double>(current, inductance));
                    }
                    graphContainer.Add(graph);
                }
            }
            Random r = new Random();
            foreach (var i in graphContainer)
            {
                fileIndex++;
                var series = new Series
                {
                    Name                = legendNames[fileIndex],
                    Color               = Color.FromArgb(r.Next(0, 256), r.Next(0, 256), r.Next(0, 256)),
                    IsVisibleInLegend   = true,
                    IsXValueIndexed     = false,
                    ChartType           = SeriesChartType.Line
                };
                foreach (var j in i)
                {
                    series.Points.AddXY (j.Item2, j.Item1);
                }
                chart.Invalidate        ();
                chart.Series.Add        (series);
            }
        }
    

    建议:(?)

    enter image description here

    2 回复  |  直到 8 年前
        1
  •  0
  •   TaW    8 年前

    您已经发布了一个解决方案:

    在循环中添加新数据之前,请确保已删除旧数据。可以通过创建新实例来完成此操作:

    graph = new List<Tuple<double, double>>();
    

    这是一个有效的方法。

    但为了完整起见,让我们来看看更直接的方法:

    graph.Clear();
    

    这将清除列表对象中的数据。但是你要把图表添加到 graphContainer 这样的列表:

    graphContainer.Add(graph);
    

    也就是说 真正的目标 在下一个循环之前, 将被清除 是的。这是一个常见的错误。解决方法很简单:不要将graph对象本身添加到 抓斗 只列出一个 复制 其中:

    graphContainer.Add(graph.ToList());
    

    这个 ToList() 调用是创建 List<T> 是的。


    至于 post you linked to :旧文章严格地讲是关于运行时性能的。而不是创建列表的副本。

    但即使在那里,推荐的方法也取决于您是否可以预测将要放入每个列表中的元素的数量。

    如果 你可以预测它 如果 它有点大,比方说超过几百个大的 成千上万个小元素应该告诉列表它应该保留哪些容量。

    这样可以避免多重生长痛。之后 Clear() 这个 Capacity 保留,避免新的分配。

    您的元素(元组)很小,所以您可能不需要担心列表的性能增长。

        2
  •  0
  •   Joel    8 年前

    根据用户@taw的建议,我忘记创建 graph 或者在跑步之间清空它。

    graph = new List<Tuple<double, double>>(); // <-- solved it
    while (!csvParser.EndOfData)
    {
          string[] fields     = csvParser.ReadFields();
          ...
    }
    

    编辑:

    不使用 yourList.Clear() 看这里为什么: https://stackoverflow.com/a/35848659/2902996

    推荐文章