私は次のクラス構造を持っています:
_public class PriceLog
{
public DateTime LogDateTime {get; set;}
public int Price {get; set;}
}
_
List <PriceLog>の場合、次のように表されるデータと同等の出力を生成するLinqクエリが必要です。
LogDateTime | AVG(価格)
2012年1月| 2000年
2012年2月| 3000
単純に:各月の平均価格を計算したい。
注:LogDateTimeプロパティはLogDateTime.ToString("MMM yyyy")
としてフォーマットする必要があります
私は次を試しましたが、それが望ましい結果を生成するかどうかはわかりません:
_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)};
_
これにより、日付文字列と平均価格の2つのプロパティを含む匿名オブジェクトのシーケンスが得られます。
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)
};
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)
}
次のように試してください:
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();
Priceフィールドがintであり、Averageメソッドがdoubleを返すため、これをintに変換しました。これが役立つことを願っています