Es gibt keine solche Sammlung verfügbar, aber eine ist ziemlich einfach zu schreiben. Der beste Weg, dies zu tun, ist einen neuen Sammlertyp zu erstellen, der einen vorhandenen Sammlertyp einkapselt.
Zum Beispiel
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
}
Ein paar Antworten vorgeschlagen Vererbung als Mechanismus. Dies ist sicherlich keine gute Route, besonders wenn Sie von einer der generischen Sammlungen ableiten. Diese Sammlungen sind nicht darauf ausgelegt, vererbt zu werden, und es ist sehr einfach, versehentlich alle Prüfungen zu umgehen, die Sie als Ergebnis einer Add- oder Remove-Methode durchführen.
Der Hauptgrund ist, dass diese Methoden nicht virtuell sind und daher nicht überschrieben werden können. Sie wären gezwungen, entweder eine Add-Methode mit einem anderen Namen zu deklarieren (und damit Ihre Benutzer zu verwirren) oder Add mit der neuen Syntax erneut zu deklarieren. Letzteres ist sehr unsicher, da sobald eine Instanz Ihrer Klasse an eine Referenz des Basistyps übergeben wird, alle Ihre Methoden nicht aufgerufen werden und die Liste die Kapazität überschreiten kann.
EDIT
Als Abschnitt Diskussion Kommentar wurde, angegeben hier List<T>
ist nicht der beste Ansatz zu implementieren. Der Grund dafür ist, dass es in mehreren Fällen gegen das Substitutionsprinzip verstößt. Die einfachste Möglichkeit, das Problem anzuzeigen, stellen Sie sich vor, wenn meine Implementierung an die folgende Methode übergeben wurde. Dieser Code sollte für jede IList<T>
Implementierung übergeben werden, würde aber in diesem Fall fehlschlagen, wenn die Liste ausgelastet wäre.
public void Example<T>(IList<T> list, T value) {
var count = list.Count;
list.Add(value);
var addedValue = list[count];
}
Die einzige Sammlung Schnittstelle, die für die angegebene Sammlung durchgeführt werden kann, ist rechtsgültig IEnumerable<T>
. Ich habe meine Implementierung als Beispiel dort oben gelassen. Aber sehen ShuggyCoUk Antwort für eine IEnumerable<T>
Umsetzung:
Ich glaube nicht das entspricht seinen Bedürfnissen. Er wollte, dass das neue Element hinzugefügt und ein altes gelöscht wurde, während ArrayList.FixedSize() die Erweiterung der Liste verhindert. –