Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有限制项目的列表_C#_List_Generics_Queue - Fatal编程技术网

C# 有限制项目的列表

C# 有限制项目的列表,c#,list,generics,queue,C#,List,Generics,Queue,我需要保持一个简短的价值观历史记录。所以我需要一个最大项目数的列表。我希望它能接受新的添加,即使它已经满了。在这种情况下,我希望我添加的最旧项目丢失。 我没有找到适合这个目的的课程,于是我自己上了。我以后肯定会添加方法,但现在我有我需要的 所以我的第一个问题是:这是正确的代码吗 你觉得那堂课干净吗 我的第二个问题是关于我抛出的这些例外 /// <summary> /// Oldest item added to the list /// </summary> public

我需要保持一个简短的价值观历史记录。所以我需要一个最大项目数的列表。我希望它能接受新的添加,即使它已经满了。在这种情况下,我希望我添加的最旧项目丢失。 我没有找到适合这个目的的课程,于是我自己上了。我以后肯定会添加方法,但现在我有我需要的

所以我的第一个问题是:这是正确的代码吗 你觉得那堂课干净吗

我的第二个问题是关于我抛出的这些例外

/// <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];
    }
}
//
///已将最旧的项目添加到列表中
/// 
公众优先
{
得到
{
如果(_头<0)
抛出新的IndexOutOfRangeException(“列表为空”);
如果(_firstRoundDone)
返回_数组[(_head+1)%_max];
其他的
返回_数组[0];
}
}
在将任何内容添加到我的列表之前,我希望调用
First
Last
Count
返回null。我认为这更有意义。但是我不知道怎么做,因为返回类型是int或t,我不想为其添加像
这样的约束,其中t:Nullable

由于我看不到任何解决方案,我想知道例外是否毕竟是最优雅的方式。或者我应该实现像
GetFirst(out T first)
或者甚至
TryGetFirst(out T)
这样的方法吗?

考虑公开可用的LRU缓存,例如。

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

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

扩展
队列
将产生非常短的代码,如下所示:

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);
    }
}
公共类缓冲区:队列
{
私有int?最大容量{get;set;}
公共缓冲区(){maxCapacity=null;}
公共缓冲区(int-capacity){maxCapacity=capacity;}
公共无效添加(T新元素)
{
if(this.Count==(maxCapacity???-1))this.Dequeue();//如果maxCapacity=null,则没有限制
这个.Enqueue(newElement);
}
}

.Clear()
.ToList()
将被继承,无需实现它们。

似乎队列更合适?您可以始终返回
default(T)
而不是null…@dbaseman队列只是一个fifo集合,它不像LRU缓存那样具有有限的容量队列可能是更合适的内部数据结构,队列没有容量上限,因为我希望有一个历史记录或缓存行为。谢谢,这看起来非常好的代码。但对于我目前的小需求来说,这有点过分了。我认为它会为我描述的案例抛出一个异常。非常有趣。谢谢,这看起来很不错的代码。但对于我目前的小需求来说,这有点过分了。我认为它会为我描述的案例抛出一个异常。非常有趣。@Mr.Pe使用第三方代码将使您能够专注于应用程序的其他部分,并且当您遇到第三方代码可能已经解决的其他问题时,可以帮助您扩大规模。然而,可能还有更多,这是你的决定。你是对的。但它也会带来意想不到的行为。这是为了一个很小的目的,一个不超过20个项目的历史。这让我觉得使用一个简洁但通用的解决方案会更好。我应该降低你的等级,让我看起来很愚蠢。谢谢你这个聪明的解决方案,不客气。请注意,对于
队列的线程安全性
提供了
同步
方法,以获得线程安全包装(MSDN具有所有信息,包括增长率:)