.net中的滚动列表

niwlg2el  于 2023-10-21  发布在  .NET
关注(0)|答案(3)|浏览(144)

在.NET中是否有任何列表/集合类的行为类似于滚动日志文件?用户可以在其中添加元素,但如果超过最大容量,列表将自动删除旧元素。
我还想访问列表中的任何元素,例如。列表[102]等。

aelbi1ox

aelbi1ox1#

下面是一个简单的实现:

public class RollingList<T> : IEnumerable<T>
{
    private readonly LinkedList<T> _list = new LinkedList<T>();

    public RollingList(int maximumCount)
    {
        if (maximumCount <= 0)
            throw new ArgumentException(null, nameof(maximumCount));

        MaximumCount = maximumCount;
    }

    public int MaximumCount { get; }
    public int Count => _list.Count;

    public void Add(T value)
    {
        if (_list.Count == MaximumCount)
        {
            _list.RemoveFirst();
        }
        _list.AddLast(value);
    }

    public T this[int index]
    {
        get
        {
            if (index < 0 || index >= Count)
                throw new ArgumentOutOfRangeException();

            return _list.Skip(index).First();
        }
    }

    public IEnumerator<T> GetEnumerator() => _list.GetEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
qmelpv7a

qmelpv7a2#

Microsoft的标准类不存在。但是你可以观看队列<>类。
Queue<>类自动扩展的一个问题。你可以在线程Limit size of Queue in .NET?中解决这个问题
可以通过扩展方法访问任何元素。举例来说:

LogItem result = collection.Where(x => x.ID == 100).FirstOrDefault();
vxqlmq5t

vxqlmq5t3#

public class RollingWindow<T>: IEnumerable<T>
{
    private readonly T[] _array;

    public RollingWindow(int capacity) => _array = new T[capacity];

    public int Count { get; private set; } = 0;

    private int _headIndex = 0;

    public void Add(T item)
    {
        if (Count < _array.Length)
        {
            _array[Count++] = item;
        }
        else
        { 
            _array[_headIndex++] = item;
            if (_headIndex == _array.Length) _headIndex = 0;
        }
    }

    public T this[int index]
    {
        get
        {
            if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException(nameof(index));
            index += _headIndex;
            if (index >= Count) index -= Count;
            return _array[index];
        }
    }

    public IEnumerator<T> GetEnumerator()
    {
        for (int i = 0; i < Count; i++)
        {
            yield return this[i];
        }
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

相关问题