Propriedade com enumerável ou lista
-
22-09-2019 - |
Pergunta
Estou brincando com o LINQ e assuntos relacionados e estava me perguntando sobre o seguinte.
Eu tenho 2 métodos para obter uma sequência de Fibonacci. Comecei com:
public static IEnumerable<int> Fibonacci
{
get
{
int i = 0;
int j = 1;
int temp = 0;
while (true)
{
yield return i;
temp = i;
i = j;
j = temp + i;
}
}
}
Mas isso me fez pensar, por que eu escolheria isso:
public static IList<int> Fibonacci(long to)
{
IList<int> fibList = new List<int>();
int i = 0;
int j = 1;
int temp, index = 0;
while (index < to)
{
fibList.Add(i);
temp = i;
i = j;
j = temp + i;
index++;
}
return fibList;
}
Ilist é um enumerável também + posso querer adicionar alguma parametrização a ele. Não estou realmente procurando otimizações ou coisas ou coisas como usar <long> porque o número fica grande rápido, é apenas um exemplo rápido. Apenas alguns argumentos pro e a cada método. Por que e quando devo usar qual método?
Solução
Uma diferença importante entre os dois é que, com sua segunda versão, você deve saber com antecedência quando deseja parar, mas na primeira versão você pode começar a iterando e depois decidir quando parar. Você não precisa saber com antecedência.
Você também não precisa armazenar a lista inteira na memória de uma só vez com a primeira versão. Você pode lidar com os dados de maneira a transmitir.
Uma vantagem do segundo é que o retorno de uma lista permite indexar na matriz, em vez de lidar com elementos um por um desde o início. Você pode usar a segunda versão se souber quantos elementos deseja e souber que a lista é pequena o suficiente para caber na memória.
Observe que essas diferenças não têm nada a ver com você usar uma propriedade ou uma chamada de função. Você pode reescrever o primeiro a ser uma chamada de função que não usa parâmetros.
Se você tiver apenas a primeira versão disponível, poderá imitar facilmente a segunda versão usando Fibinocci().Take(20).ToList()
.
Outras dicas
Por que você usaria uma propriedade (estática ou não). Um número de fibonacci gera é uma propriedade de quê ...? Além disso, como regra geral, uma propriedade nunca deve executar nenhum cálculo/processamento "significativo"; portanto, você definitivamente deseja usar uma função aqui.
Se você colocar a primeira versão em um foreach
Em seguida, ele nunca terá rescisão, a menos que você se divirta especificamente. Fonte potencial para um bug ao usá -lo. Talvez seja isso que você quer, mas é algo para ser cauteloso.