Quando vi no começo você dizendo que o segundo exemplo era o bom, já me doeou, mas eu fui lendo a explicação, e te perdoei 😀.
Esse sim é um conteúdo... parabéns!
O pessoal não ta preocupado com isso, porque o essencial hoje é programar com strategy(acho importante), mas as vezes custa. E no fim o problema nunca é custo, e sim saber porque custa e saber se vale a pena.
Em "Aprendendo a substituir heap alloc..." no número 5, foi dito "capacity no construtor que vai reduzir a quantidade de alocações internamente".
Ai se você me permitir contribuir...
Pra quem não sabe (certeza que não é o teu caso), por debaixo dos panos a ICollection vai usar array comum, e toda vez que precisamo aumentar uma array não tem segredo, temos que criar uma nova com mais espaço e a antiga liberar da memória.
Nesse sentido se você tive 500 itens pra colocar na sua collection, e sua collection tiver um capacity de 50 itens, então quando chegar a 50 o .NET (ou qualquer outra), vai precisa alocar e liberar, fazendo isso pelo menos umas 10x (não sei a heurística para isso, só ex) até chegar em 500, agora se você já sabe que são 500 itens já inicializa alocando 500 "itens".
Normalmente utilizamos coisas dinâmicas então não temos como saber exatamente a quantidade de itens, então eu coloco algo próximo (tiro do 👌🏻 essa ideia)...
var capacity_qtde_kids = familys.Lenght * 2
óbvio que as vezes pode passar, como pode ser pouco também, mas é melhor do que não ter número nenhum.