从List <pointf>的所有元素的x轴减去1

时间:2018-02-01 08:50:20

标签: c# list

我正在连续读取串口的样本,我想在图表中显示最后400个样本。 因此,当收到的样本数变为400时,我应该将myPointFs列表向左移1并添加最后收到的样本 到最后。我的下面代码在前400个样本中成功运行。

    List<PointF> myPointFs = new List<PointF>();
    uint sampleNumber = 0; PointF Current_PointFs;

    private void UpdateVar(object sender, EventArgs e){
        ...
       Current_PointFs = new PointF((float)(sampleNumber), (float)newSample);
       if (sampleNumber < 400)
          {
            myPointFs .Add(Current_PointFs);
            ++sampleNumber;
          }
       else
          {        
           myPointFs  = myPointFs .ShiftLeft(1); //ShiftLeft is an Extension Method
           myPointFs.Add(Current_PointFs);
          }
       if (myPointFs.Count >= 2)
          {
           Configure_Graphs();// using Graphics.DrawLines(thin_pen, myPointFs.ToArray()) to draw chart
          }
    }

但是在收到前400个样本之后,我需要从myPointFs[i].X中减去1来将X轴向左移动1.可能一种方法是运行for循环。 我该如何实现它?还是有更优雅的方式?或者C#中存在的开箱即用的东西?

修改(让我的问题更清晰)

myPointFs包含以下内容:

myPointFs[0] = {X = 1, Y = 21}
myPointFs[1] = {X = 2, Y = 50}
myPointFs[2] = {X = 3, Y = 56}

现在我将通过左移1来删除第一个元素,并在最后添加一个新样本。

myPointFs[0] = {X = 2, Y = 50}
myPointFs[1] = {X = 3, Y = 56}
myPointFs[2] = {X = 4, Y = 68}

但我最终需要这样的事情:

myPointFs[0] = {X = 1, Y = 50}
myPointFs[1] = {X = 2, Y = 56}
myPointFs[2] = {X = 3, Y = 68}

2 个答案:

答案 0 :(得分:3)

因此,您希望删除第一个元素并减少每个剩余点的X值。你可以一气呵成:

myPointFs = myPointFs.Skip(1).Select(p => new PointF(p.X-1, p.Y)).ToList();

答案 1 :(得分:1)

这是Queue<T>的工作。在您的情况下,X将为索引,Y将数据插入Queue。 这里有一些代码来说明它是如何工作的:

    static void Main(string[] args)
    {
        var queue = new Queue<int>(10); //Capacity of Queue is 10

        Console.WriteLine("=== Writing to Queue ===");

        for (int i = 0; i < 23; ++i) //22 rounds for inserting data
        {
            DequeueIfFull(i, queue);

            Console.WriteLine("Inserting number {0} into Queue", i);
            queue.Enqueue(i); //Read and remove the first item in Queue
        }

        FlushQueue(queue); //Last time read all values from queue

        Console.ReadKey();
    }

    private static void DequeueIfFull(int i, Queue<int> queue)
    {
        var tenthItemInserted = (i != 0) && (i % 10 == 0);

        if (tenthItemInserted)
        {
            Console.WriteLine("Dequeuing from Queue");
            for (int j = 0; j < 10; ++j)
            {
                Console.WriteLine("  Number dequeued on position {0} is {1}", j, queue.Dequeue());
            }
        }
    }

    private static void FlushQueue(Queue<int> queue)
    {
        Console.WriteLine();
        Console.WriteLine("=== Reading final Queue state ===");
        var index = 0;

        foreach (var itemInQueue in queue)
        {
            Console.WriteLine("At position {0} is number {1} ", index, itemInQueue);
            index++;
        }
    }

Queue的文档,并链接到有关Data Structures的好文章。