[英]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.