Is it really necessary to use List<Line> here?

The size of the file cannot change. So we could use Line[]. Which is one less object allocation, and removes a metric ton of virtual method dispatching during access.