我目前正在寻找自己的集合,这就像一个常规列表,除了它只能容纳10个项目.如果在列表中已有10个项目时添加了项目,则在添加新项目之前将删除第一个项目.
我想要做的是创建一个扩展的类,System.Collections.Generic.List
然后修改Add(T item)
方法以包含在必要时删除第一个项目的功能.
您还可以通过实现add方法
public new void Add(...)
在派生类中隐藏现有的添加并引入您的功能.
编辑:粗略轮廓......
class MyHappyList: List { public new void Add(T item) { if (Count > 9) { Remove(this[0]); } base.Add(item); } }
只是一个注释,认为它是隐含的,但您必须始终按实际类型引用您的自定义列表,而不是基本类型/接口,因为隐藏方法仅适用于您的类型和其他派生类型.
首先,您不能覆盖Add并且仍然具有针对List的多态性,这意味着如果您使用new关键字并且您的类被强制转换为List,则不会调用您的新Add方法.
其次,我建议您查看Queue类,因为您要做的更多的是队列而不是列表.该类针对您想要做的事情进行了优化,但没有任何类型的大小限制器.
如果你真的希望某些东西像List一样工作但是像一个最大大小的队列那样工作,我建议你实现IList并保留一个Queue实例来存储你的元素.
例如:
public class LimitedQueue: IList { public int MaxSize {get; set;} private Queue Items = new Queue (); public void Add(T item) { Items.Enqueue(item); if(Items.Count == MaxSize) { Items.Dequeue(); } } // I'll let you do the rest }
您不能覆盖Add(),它不是虚方法.改为从IList派生并使用私有Queue成员进行实现.
您可以扩展System.Collections.ObjectModel.Collection并覆盖InsertItem方法以获得所需的行为,并且它还实现了IList
您可以编写一个实现IList
包含内部的类List
并编写自己的方法.
看起来我能做的最好的就是:
class MostRecentList: System.Collections.Generic.List { private int capacity; public MostRecentList(int capacity) : base() { this.capacity = capacity; } public new void Add(T item) { if (base.Count == capacity) { base.RemoveAt(0); } base.Add(item); } }
由于该add()
方法未标记为虚拟.