J'ai la structure de classe suivante:
public class PriceLog
{
public DateTime LogDateTime {get; set;}
public int Price {get; set;}
}
Pour un List <PriceLog> je veux qu'une requête Linq génère une sortie équivalente aux données représentées comme ci-dessous:
LogDateTime | AVG (Prix)
Janv. 2012 | 2000
Fév 2012 | 3000
Simplement: je veux calculer le prix moyen sur chaque mois de l'année.
Remarque: la propriété LogDateTime doit être formatée comme LogDateTime.ToString("MMM yyyy")
J'ai essayé ce qui suit, mais je ne sais pas si cela générera le résultat souhaité:
var result = from priceLog in PriceLogList
group priceLog by priceLog.LogDateTime.ToString("MMM yyyy") into dateGroup
select new PriceLog { GoldPrice = (int)dateGroup.Average(p => p.GoldPrice), SilverPrice = (int)dateGroup.Average(p => p.SilverPrice)};
Cela vous donnera une séquence d'objets anonymes, contenant une chaîne de date et deux propriétés avec un prix moyen:
var query = from p in PriceLogList
group p by p.LogDateTime.ToString("MMM yyyy") into g
select new {
LogDate = g.Key,
AvgGoldPrice = (int)g.Average(x => x.GoldPrice),
AvgSilverPrice = (int)g.Average(x => x.SilverPrice)
};
Si vous devez obtenir la liste des objets PriceLog:
var query = from p in PriceLogList
group p by p.LogDateTime.ToString("MMM yyyy") into g
select new PriceLog {
LogDateTime = DateTime.Parse(g.Key),
GoldPrice = (int)g.Average(x => x.GoldPrice),
SilverPrice = (int)g.Average(x => x.SilverPrice)
};
from p in PriceLog
group p by p.LogDateTime.ToString("MMM") into g
select new
{
LogDate = g.Key.ToString("MMM yyyy"),
GoldPrice = (int)dateGroup.Average(p => p.GoldPrice),
SilverPrice = (int)dateGroup.Average(p => p.SilverPrice)
}
Vous devriez l'essayer comme ceci:
var result =
from priceLog in PriceLogList
group priceLog by priceLog.LogDateTime.ToString("MMM yyyy") into dateGroup
select new {
LogDateTime = dateGroup.Key,
AvgPrice = dateGroup.Average(priceLog => priceLog.Price)
};
var result = priceLog.GroupBy(s => s.LogDateTime.ToString("MMM yyyy")).Select(grp => new PriceLog() { LogDateTime = Convert.ToDateTime(grp.Key), Price = (int)grp.Average(p => p.Price) }).ToList();
Je l'ai converti en int car mon champ Price était int et la méthode Average retourne double. J'espère que cela vous aidera