Это выглядит в основном звуковой код (игнорируя конструктивные соображения использования взаимодействий Collection, таких как перечисление, индексаторы и т. Д.)
Все проверки достоверности могут быть помещены в метод CheckValid, который просто вызывается из других ваших методов. У компилятора не должно быть проблем с его включением, поэтому вы не должны видеть снижение производительности в результате (и, конечно, если производительность является ключевой, вы должны использовать утверждения, а не проверки во время выполнения)
GetElementAt проверяет, должно ли генерироваться исключение на каждой итерации. Он может просто проверить, что значение позиции находится в пределах длины списка, прежде чем начинать перечислять элементы. (Это также приведет к сбою, если список пуст и передана ненулевая позиция). Это действительно должно проверить эту позицию> = 0 тоже.
Код для Remove и InsertAfter может использовать общий метод, который возвращает элементы в позиции и позиции-1. Это уменьшит необходимый код и уменьшит вдвое объем необходимого тестирования, хотя добавит к «InsertAfter» крошечные «предотвратимые накладные расходы».
Я бы назвал «Добавить» или «Добавить» сам, потому что он не вставляется.
Возможно, вы захотите вернуть данные из удаляемого элемента - в противном случае вам придется дважды просмотреть весь список, чтобы прочитать значение, а затем удалить его.