簡體   English   中英

在 C# 中將列表中的所有項目移動一個 position 的最佳方法

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM