4

我需要保持简短的价值观历史。所以我需要一个包含最大项目数的列表。而且我希望它即使已满也能接受新添加的内容。在这种情况下,我希望我添加的最旧的项目丢失。我没有找到任何适合这个目的的课程,然后我自己做了。稍后我肯定会添加方法,但现在我有我需要的。

所以我对你的第一个问题是:它是一个正确的代码吗:http ://pastebin.com/0BCbyNqJ 这个类对你来说看起来足够干净吗?

我的第二个问题是关于我抛出的这些异常。

/// <summary>
/// Oldest item added to the list
/// </summary>
public T First
{
    get
    {
        if (_head < 0)
            throw new IndexOutOfRangeException("The list is empty");

        if (_firstRoundDone)
            return _array[(_head + 1) % _max];
        else
            return _array[0];
    }
}

在将任何内容添加到我的列表之前,我想调用First,LastCount返回 null。我认为这会更有意义。但我不知道该怎么做,因为返回类型是 int 或 T,我不想为此添加一个约束,例如where T:Nullable. 由于我没有看到任何解决方案,我想知道 Exception 毕竟是否不是最优雅的方式。或者我应该实现像GetFirst(out T first)甚至这样的方法TryGetFirst(out T)吗?

4

4 回答 4

14

扩展Queue<>会产生非常短的代码,如下所示:

public class Buffer<T> : Queue<T>
{
    private int? maxCapacity { get; set; }

    public Buffer() { maxCapacity = null; }
    public Buffer(int capacity) { maxCapacity = capacity; }

    public void Add(T newElement)
    {
        if (this.Count == (maxCapacity ?? -1)) this.Dequeue(); // no limit if maxCapacity = null
        this.Enqueue(newElement);
    }
}

.Clear()并且.ToList()会被继承,不需要实现它们。

于 2012-09-06T07:14:29.753 回答
2

考虑公开可用的 LRU 缓存,例如http://code.google.com/p/csharp-lru-cache/

于 2012-09-06T06:42:56.450 回答
2

如果我错了,请纠正我,但听起来你想要的是一个队列。然而,这已经在 .Net 中提供了。您可能应该使用它,以及它提供的方法。

于 2012-09-06T06:44:57.323 回答
1

我认为您需要的是允许溢出的循环缓冲区。这样的实现可以在这里找到

于 2012-09-06T06:50:40.213 回答