列出限量项目

时间:2012-09-06 06:39:30

标签: c# list generics queue

我需要保持短暂的价值观。所以我需要一个包含最多项目数的列表。我希望它能够接受新的添加,即使它已经满了。在这种情况下,我希望我添加的最旧的项目丢失。 我找不到任何适合这个目的的课程然后自己做了。我一定会在以后添加方法,但现在我有我需要的东西。

所以我的第一个问题是:它是否是正确的代码: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];
    }
}

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

4 个答案:

答案 0 :(得分:13)

扩展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()将被继承,无需实施它们。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

如果我错了,请纠正我,但听起来好像你想要的是一个队列。但是,is already provided in .Net。你应该使用它,以及它提供的方法。

答案 3 :(得分:1)

我认为你需要的是一个允许溢出的循环缓冲区。这样的实现可以是found here