Нет такой коллекции, но ее довольно легко написать. Лучший способ сделать это - создать новый тип коллекции, который инкапсулирует существующий тип коллекции.
Например
public class FixedSizeList<T> : IList<T> {
private List<T> _list = new List<T>();
private int _capacity = 100;
public void Add(T value) {
_list.Add(value);
while (_list.Count > _capacity) {
_list.RemoveAt(0);
}
}
// Rest omitted for brevity
}
Несколько ответов предложили наследование в качестве механизма. Это, конечно, не очень хороший маршрут, особенно если вы извлекаете из одной из общих коллекций. Эти коллекции не предназначены для наследования, и очень легко случайно избежать любых проверок, которые вы делаете в результате применения метода добавления или удаления.
Основная причина в том, что эти методы не являются виртуальными, поэтому их нельзя переопределить. Вам придется либо объявить метод Add с другим именем (таким образом, запутать ваших пользователей), либо повторно объявить Add с новым синтаксисом. Последнее очень опасно, поскольку, как только экземпляр вашего класса передается в ссылку базового типа, все ваши методы не будут вызываться, а список может увеличиться.
EDIT
В обсуждении комментарий раздела указал, внедрение List<T>
не лучший подход здесь. Причина в том, что в некоторых случаях он нарушает принцип замещения. Самый простой способ показать проблему - представить, была ли моя реализация передана следующему методу. Этот код должен пройти для любой реализации IList<T>
, но в этом случае будет неудачным, если список был в состоянии.
public void Example<T>(IList<T> list, T value) {
var count = list.Count;
list.Add(value);
var addedValue = list[count];
}
Единственная коллекция интерфейс, который может быть реализован на законных основаниях для указанной коллекции IEnumerable<T>
. В качестве примера я оставил свою реализацию. Но увидеть ответ ShuggyCoUk в течение IEnumerable<T>
реализации:
Я не верю это отвечает его потребностям. Он хотел, чтобы новый элемент был добавлен, а старый был сброшен, а ArrayList.FixedSize() предотвратит добавление в список. –