[英]Best way to move all items in a list by one position in C#
因此,我将每 15 秒进行一次测量,并且我想将测量结果记录在 8 个最近测量值的列表中。
当列表有 8 个项目时,我想删除 position [0] 处的项目,将所有其他项目下移 1 position (所以 position [1] 处的项目是最最近测量到 position [7]。
实现这一目标的有效方法是什么?
List<Measurement> measurements;
void AddMeasurement(Measurement measurement)
{
if (measurements.Count == 8)
{
measurements.RemoveAt(0); // Indices of all remaining elements will reduce by 1
}
mesurements.Add(measurement);
}
Johnathan 的回答很简单,非常适合小型列表,但如果您需要存储的数据不是 8 个,而是更多(未来的要求),那么连续移动数据可能会变得很昂贵。 有一种简单的方法可以避免创建自定义列表包装器:
class FiniteWrapList<T>: IEnumerable<T>
{
private readonly List<T> innerList;
private int counter;
private readonly int capacity;
public static FiniteWrapList<T> CreateNew(int capacity)
=> new FiniteWrapList<T>(capacity);
private FiniteWrapList(int capacity)
{
this.capacity = capacity;
innerList = new List<T>(capacity);
}
public void Add(T t)
{
if (counter >= capacity)
{
innerList[counter % capacity] = t;
}
else
innerList.Add(t);
counter = counter % (2 * capacity) + 1;
}
public T this[int index]
{
get => innerList[(counter + index) % capacity];
}
public IEnumerator<T> GetEnumerator()
{
if (counter < capacity)
return innerList.GetEnumerator();
return GetWrappedListEnumerator();
IEnumerator<T> GetWrappedListEnumerator()
{
for (var i = 0; i < capacity; i++)
yield return innerList[(counter + i) % capacity];
}
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
这样,您就可以避免在列表中移动数据的所有混乱。 您只需创建一个智能索引器并使用一个列表即可覆盖旧数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.