gpt4 book ai didi

c# - 如何保留仅包含最后 n 个对象的列表?

转载 作者:可可西里 更新时间:2023-11-01 03:06:28 26 4
gpt4 key购买 nike

我想对特定方法进行一些性能测量,但我想平均完成所需的时间。 (这是一个 C# Winforms 应用程序,但这个问题很可能适用于其他框架。)

我有一个秒表,我在方法开始时重置它并在结束时停止。 我想将最后 10 个值存储在列表或数组中。添加的每个新值都应将最旧的值推离列表。

我会定期调用另一个方法来计算所有存储值的平均值。

我认为这个构造是一个循环缓冲区是否正确?

我怎样才能创建这样一个具有最佳性能的缓冲区?现在我有以下内容:

List<long> PerfTimes = new List<long>(10);

// ...

private void DoStuff()
{
MyStopWatch.Restart();
// ...
MyStopWatch.Stop();
PerfTimes.Add(MyStopWatch.ElapsedMilliseconds);
if (PerfTimes.Count > 10) PerfTimes.RemoveAt(0);
}

这似乎有点低效,但也许不是。

建议?

最佳答案

您可以创建自定义集合:

class SlidingBuffer<T> : IEnumerable<T>
{
private readonly Queue<T> _queue;
private readonly int _maxCount;

public SlidingBuffer(int maxCount)
{
_maxCount = maxCount;
_queue = new Queue<T>(maxCount);
}

public void Add(T item)
{
if (_queue.Count == _maxCount)
_queue.Dequeue();
_queue.Enqueue(item);
}

public IEnumerator<T> GetEnumerator()
{
return _queue.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}

您当前的解决方案有效,但效率低下,因为删除了 List<T> 的第一项。很贵。

关于c# - 如何保留仅包含最后 n 个对象的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6392516/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com