iterator com yield return vs retornar uma List<T>: quanto custa de verdade um método IEnumerable em C#
Um método com yield return custa um objeto de máquina de estados de 40 bytes por chamada, não importa quantos itens produza; uma List<T> custa todo o array interno de uma vez. Medido no .NET 10.0.10: o iterator vence em memória e em saída antecipada, a List<T> vence quando o chamador enumera mais de uma vez, precisa de Count ou chama ToList().