Sunday 13 August 2017

Mover Média Linq


Para alcançar um desempenho assintótico de O (n) (como a solução codificada manualmente), você poderia usar a função Agregado como em O valor acumulado (implementado como tipo anônimo) contém dois campos: O resultado contém a compilação da lista de resultados tão longe. O trabalho contém os últimos elementos do período 1. A função de agregação adiciona o valor atual à lista de trabalho, cria a média atual e adiciona-a ao resultado e, em seguida, remove o primeiro valor (ou seja, o mais antigo) da lista de trabalho. A semente (ou seja, o valor inicial para a acumulação) é compilada colocando os primeiros elementos do período 1 em Trabalhando e inicializando o Resultado em uma lista vazia. Consequentemente, a agregação começa com o período do elemento (saltando elementos (período 1) no início) Na programação funcional, este é um padrão típico de uso para a função agregada (ou dobra), btw. A solução não é funcionalmente limpa na medida em que os mesmos objetos de lista (Trabalho e Resultado) são reutilizados em cada etapa. Não tenho certeza se isso pode causar problemas se alguns compiladores futuros tentam paralizar a função Agregação automaticamente (por outro lado, eu também não tenho certeza, se isso for possível depois de tudo). Uma solução puramente funcional deve criar novas listas em cada etapa. Observe também que C não possui expressões de lista poderosas. Em algum pseudocódigo hipotético Python-C-mixed pode-se escrever a função de agregação como a qual seria um pouco mais elegante na minha humilde opinião :) Observe o tempo de execução de O (n2). Uma vez que você precisa pular mais e mais elementos em cada etapa (e afaik Skip (i) tem que chamar IEnumerator. MoveNext i times). Veja a minha resposta para uma solução no tempo O (n). (Eu apenas notei o comentário OPs abaixo que ele possivelmente obterá os valores de um SQL DB no futuro. Neste caso, eu iria desanimar cada uma dessas soluções) ndash MartinStettner Mar 3 11 às 0:53 Para a maneira mais eficiente Possível calcular uma média móvel com o LINQ, você não deve usar o LINQ Em vez disso, proponho criar uma classe auxiliar que calcula uma média móvel da maneira mais eficiente possível (usando um buffer circular e filtro médio causal), então um método de extensão para torná-lo Acessível ao LINQ. Primeiro, a média móvel Esta classe fornece uma implementação muito rápida e leve de um filtro MovingAverage. Ele cria um buffer circular de Comprimento N e calcula um som, um subtrair e um multiplicar por ponto de dados anexado, em oposição ao N multiplicação por ponto para a implementação da força bruta. Os métodos de extensão acima envolvem a classe MovingAverage e permitem a inserção em um fluxo IEnumerable. Para fazer isso de uma forma mais funcional, você precisa de um método de varredura que exista no Rx, mas não no LINQ. Vamos ver como isso pareceria se você tivesse um método de varredura. Além disso, o método de varredura, tomado e ajustado a partir daqui: isso deve ter melhor desempenho do que o método de força bruta, uma vez que estamos usando um total em execução para calcular o SMA. Para começar precisamos calcular o primeiro período que chamamos de semente aqui. Então, cada valor subseqüente calculamos a partir do valor de semente acumulado. Para fazer isso, precisamos do valor antigo (isto é, t-delta) e do valor mais novo para o qual fazemos o conjunto das séries, uma vez desde o início e uma vez deslocadas pelo delta. No final, fazemos uma limpeza adicionando zeros para o comprimento do primeiro período e adicionando o valor inicial da semente. Respondeu 19 de junho 13 em 22: 58 Meu objetivo é obter uma média ponderada de uma tabela, com base em outra tabela de chave primária. Eu preciso obter uma média ponderada com base no comprimento de um segmento e preciso ignorar valores de -1. Eu sei como fazer isso em SQL, mas meu objetivo é fazer isso no LINQ. Parece algo assim no SQL: ainda sou muito novo para o LINQ, e tendo dificuldade em descobrir como eu traduziria isso. A média ponderada do resultado deve chegar a cerca de 55,3. Obrigado. Perguntei 26 de abril 10 às 15:23 Eu faço isso o suficiente para criar um método de extensão para o LINQ. Depois de obter o subconjunto de dados, a chamada parece assim. Isso se tornou extremamente útil porque eu posso obter uma média ponderada de qualquer grupo de dados com base em outro campo dentro do mesmo registro. Verifique agora a divisão por zero e lance uma exceção mais detalhada ao invés de retornar 0. Permite que o usuário capture a exceção e manipule conforme necessário. Se você está certo de que, para cada chave estrangeira na Tabela 2, há um registro correspondente na Tabela 1, então você pode evitar a junção apenas fazendo um grupo. Nesse caso, a consulta LINQ é assim: é assim que você pode obter a média de uma chave estrangeira específica. O método ToList chamado ao buscar os registros é evitar a execução da consulta duas vezes ao agregar os registros nas duas operações de Soma separadas.

No comments:

Post a Comment