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具有所有信息,包括增长率:)